2016-09-01 10 views
4
' Display the names in C:\ that represent directories. 
MyPath = "c:\" ' Set the path. 
MyName = Dir(MyPath, vbDirectory) ' Retrieve the first entry. 
Do While MyName <> "" ' Start the loop. 
     ' Use bitwise comparison to make sure MyName is a directory. 
     If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then 
     ' Display entry only if it's a directory. 
     MsgBox(MyName) 
     End If 
    MyName = Dir() ' Get next entry. 
Loop 

私は上記のコードを見ています。私は特に "MyName = Dir()"が何をしているのか理解していません。それは次のエントリを取得するコメントですが、私はそれが次のエントリを取得する方法を理解していません - 特にDir()は何ですか?Dir()関数の理解

+0

Dir()ではなくFileSystemObjectまたはFileDialogを使用することをお勧めします。 –

+0

@ExcelDevelopersなぜですか? – james1395

+0

'FileSystemObject'は、このようなタスクで* much *使いやすくなっています。上記のコードは基本的に次のようになります: 'For Each foo in CreateObject(" Scripting.FileSystemObject ")。GetFolder(" C:\ ")サブフォルダ:MsgBox(foo.Path):Next' – Comintern

答えて

10

Dirは、エッジ効果を持つ機能です。

Dirへの最初の呼び出し:MyName = Dir(MyPath, vbDirectory)は、Dir内部を初期化し、最初のディレクトリエントリを返します。

その後のDirの呼び出しは同じコンテキストを使用し、MyPathディレクトリの内容を1つずつ返します。

リエントラントではありません(これはまた、Dirを使用して複数のループをネスト/リクルートすることもできません)。それほどエレガントではありませんが、それはどのように動作するのですか。

+0

Dir –

+0

@TimWilliamsを使用して複数のループをネストできない理由は、リエントラントではありません。これを行うには、ファイルの完全なリストを格納し、その後に再帰呼び出しを実行する必要があります。 –

+1

私は "リエントラント"(私はちょうどそれを見上げるまで)で明確ではないことを認めます... –

2

Dir() MSDNによれば、

は、指定されたパターンやファイル属性、またはドライブのボリュームラベルと一致したファイル、ディレクトリ、またはフォルダの名前を表す文字列を返します。

+2

あなたのリンクに続いて私はちょうどOPが投稿したサンプルコードを見つけました。 –