
フォルダ内のファイルをぜんぶ書き出すマクロ
今回はフォルダ内のファイル一覧を作成するというマクロを作っていきたいと思います。
フォルダーというのは、ディレクトリとも呼びます。
サンプルは、Dドライブにある顧客データというディレクトリの中にある ファイルを全て書き出したいということです。
どんなファイルが入っているのかは、フォルダ内を見ればわかりますが、 名前をいちいち書き出すのは大変です。

フォルダ名を指定すれば、メッセージボックスやシート上にあるいはイミディエイトウィンドウに書き出してくれるというのは便利なわけです。
さて、マクロを考える時に最初の問題は、どのようにしてフォルダの場所、アドレスをエクセルに教えるかということです。
変数Pathと変数myFileNameをString型で作り、そこにアドレスを指定しましょう。
Dim myFileName As String, Path As String

次にフォルダ内のファイルをどうすればピックアップできるかというと、Dir関数(ディレクトリ関数)というのがあります。
Dir関数は、ファイルが存在するかどうかを判定できる関数です。
引数に指定したファイルが存在すると、Dir関数はファイル名を返します。
Path = "d:\顧客データ\"
myFileName = Dir(Path & "*.xlsx")

Dir関数(ディレクトリ関数)の構文は
Dir(パス名 [, 属性])
そのDir関数(ディレクトリ関数)の
引数に指定するパス名(ファイル名)には、便利なことに
「* や ? 」のワイルドカードを指定できます。
下記のコードの意味は、変数 path で指定したフォルダの中に. 名前は問わないけれど、xlsx ファイルがあるかという意味です。
myFileName = Dir(Path & "*.xlsx")

これで Excel ファイルの名前をどれか一つ取り出すことができます。
複数ある場合でも、どれか一つ最初に見つかったファイルを返してくれます。
また、Dir関数は引数を省略すると、直前に指定したファイル名が再度指定されたものと判断して、
まだ返していないファイル名を順に返します。

指定したフォルダーの中からひとつずつ名前を返してもらって、全部返し終わるまでというような条件で処理を繰り返す場合には、
Do LOOP ステートメントを使います。
繰り返し処理を回数で指定するのが、For NEXT ステートメントです。
しかし、何回繰り返すのかはやってみなけりゃわからないということも処理の中にはあるんですよね。
Do...Loop ステートメントは繰り返し回数を指定する必要はありません。
条件式に until あるいはWhileを指定します。

Do While ...Loop ステートメントの場合
Do While LOOP ステートメントの場合は、
条件を満たす間繰り返し行うというものですので、
条件式はxlsxファイルがある間という意味になります。
その場合あるというのを表すのに <> "" と 記述します。
ナッシングではないという2重否定です。
ここは意味的には、ファイルがある間としたいところですが、あるという表現がないのです。
Sub ファイルー覧作成()
Dim i As Long, myFileName As String, Path As String
Path = "d:\顧客データ\"
myFileName = Dir(Path & "*.xlsx")
i = 2
Do While myFileName <> ""
Cells(i, 1).Value = myFileName
myFileName = Dir()
i = i + 1
Loop
MsgBox "全部で" & i - 2 & "個ファイルがありました"
End Sub
Do Until ...Loop ステートメントの場合
条件を満たすまで繰り返し行うというものです。
こちらは、ファイルがないという条件を満たすまでということになります。
Do Until myFileName = ""
書きかたとして、= ""は素直でわかりやすいですね。

Sub ファイルー覧作成Until()
Dim i As Long, myFileName As String
myFileName = Dir("d:\顧客データ\*.xlsx")
i = 2
Do Until myFileName = ""
Cells(i, 1).Value = myFileName
myFileName = Dir()
i = i + 1
Loop
MsgBox "全部で" & i - 2 & "個ファイルがありました"
End Sub
さて、どちらも実行した結果は同じで、シートに4つのファイル名が記載されました。
