フォルダ内のファイルをぜんぶ書き出すマクロ 『マクロ講座入門編EX0-3回』

フォルダ内のファイルをぜんぶ書き出すマクロ

マクロ講座EX 動画編 03回
マクロ講座

フォルダ内のファイルをぜんぶ書き出すマクロ

フォルダ内のファイル一覧を作成する

今回はフォルダ内のファイル一覧を作成するというマクロを作っていきたいと思います。
フォルダーというのは、ディレクトリとも呼びます。

フォルダ内のファイルをぜんぶ書き出すマクロ

指定フォルダ内のファイルを書き出す

  1. サンプルは、Dドライブにある顧客データというディレクトリの中にある ファイルを全て書き出したいということです。

    どんなファイルが入っているのかは、フォルダ内を見ればわかりますが、 名前をいちいち書き出すのは大変です。

    フォルダ内のファイルを全部書き出す1
  2. フォルダ名を指定すれば、メッセージボックスやシート上にあるいはイミディエイトウィンドウに書き出してくれるというのは便利なわけです。

    さて、マクロを考える時に最初の問題は、どのようにしてフォルダの場所、アドレスをエクセルに教えるかということです。

    変数Pathと変数myFileNameをString型で作り、そこにアドレスを指定しましょう。
    Dim myFileName As String, Path As String

    フォルダ内のファイルを全部書き出す2
  3. 次にフォルダ内のファイルをどうすればピックアップできるかというと、Dir関数(ディレクトリ関数)というのがあります。

    Dir関数は、ファイルが存在するかどうかを判定できる関数です。
    引数に指定したファイルが存在すると、Dir関数はファイル名を返します。
    Path = "d:\顧客データ\"
    myFileName = Dir(Path & "*.xlsx")

    フォルダ内のファイルを全部書き出す3
  4. Dir関数(ディレクトリ関数)の構文は
    基本構文 Dir(パス名 [, 属性])

    そのDir関数(ディレクトリ関数)の
    引数に指定するパス名(ファイル名)には、便利なことに 「* や ? 」のワイルドカードを指定できます。

    下記のコードの意味は、変数 path で指定したフォルダの中に. 名前は問わないけれど、xlsx ファイルがあるかという意味です。 myFileName = Dir(Path & "*.xlsx")

    フォルダ内のファイルを全部書き出すDir関数
  5. これで Excel ファイルの名前をどれか一つ取り出すことができます。
    複数ある場合でも、どれか一つ最初に見つかったファイルを返してくれます。

    ポイント
    また、Dir関数は引数を省略すると、直前に指定したファイル名が再度指定されたものと判断して、 まだ返していないファイル名を順に返します。

    フォルダ内のファイルを全部書き出すDir関数2

条件が継続する間繰り返す

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

    フォルダ内のファイルを全部書き出す6
  2. 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
  3. Do Until ...Loop ステートメントの場合
    条件を満たすまで繰り返し行うというものです。
    こちらは、ファイルがないという条件を満たすまでということになります。
    Do Until myFileName = ""
    書きかたとして、= ""は素直でわかりやすいですね。

    フォルダ内のファイルを全部書き出す7
    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. さて、どちらも実行した結果は同じで、シートに4つのファイル名が記載されました。

    フォルダ内のファイルを全部書き出す8