このVBAが記入されているエクセルファイルと同じフォルダ内に保存されているファイルの名前をエクセルシートに書き出します。
サンプルコード
Sub ファイル名一覧作成()
Application.ScreenUpdating = False
' 変数の定義
Dim wsA As Worksheet
Set wsA = ThisWorkbook.Sheets("data")
' 「data」シートのセルを消去
wsA.Cells.Clear
' タイトル行の追加
wsA.Range("A1") = "ファイル名"
' ----------------
' ファイル名の書き出し
' ----------------
Dim fName As String
Dim i As Long
i = 2
fName = Dir(ThisWorkbook.Path & "\")
Do While fName <> ""
wsA.Cells(i, "A") = fName
i = i + 1
fName = Dir()
Loop
fName = Dir("C:\")
Application.ScreenUpdating = True
End Sub
サンプルコードの説明
画面の更新をストップする
Application.ScreenUpdating = False
Excelのシートにファイル名を書き出していくマクロのため、画面の更新を止めています。
処理速度向上のための設定のため、記入していなくても動きます。
終了時に、設定をもとに戻します(Application.ScreenUpdating = True)。
ファイル名を書き出すエクセルシートを変数に代入する
Dim wsA As Worksheet
Set wsA = ThisWorkbook.Sheets(“data”)
ファイル名を書き出すシートを変数wsAに代入します。
詳細は「作業シートを明示すべき理由と簡単な指定方法」をご参照ください。
ファイル名を書き出す
今回はパス名に、ThisWorkbook.Path & “\”と入力し、このマクロが入力されているExcelファイルが保存されているフォルダ内を指定しています。
ファイル名を一括で書き出したいときに、書き出したいファイル群を特定のフォルダ内に移動させるよりも、書き出したいファイル群が保存されているフォルダにExcelファイルを移動させる方が簡単なため、相対パスで指定しています。
属性は今回は単純にファイル名を取得したいだけなので省略しています。
つまり、
fName = Dir(ThisWorkbook.Path & “\”)
は「このExcelファイルが保存されているフォルダ内の1つめのファイル名を変数fNameに入れる」ということになります。
取得したファイル名をExcelシートに入力しています。
Dir()は直前に使用したDir関数と同様の条件で、次のファイル名を取得できます。
fName = Dir()で取得したファイル名を同様にExcelのシートに入力します。
処理を繰り返す
Do~Loopで処理を繰り返します。(Do~Loopについての詳細説明は「繰り返しはどれを選んだらいいの? For~NextとDo~Loopの違いと使用時のポイントを解説」をご参照ください)
今回は取得したファイル名が空になるまで(fName=””)
- 取得したファイル名をExcelシートに入力する
- ファイル名を入力する行番号の更新:次の行に入力する(i = i + 1)
- 次のファイル名の取得(fName = Dir())
を繰り返ししています。
フォルダがロックされるのを防ぐ
Dir関数を使用すると、最後に参照したフォルダが使用中になっています。
このままでは、フォルダの移動や削除をしようとすると「使用中のため、削除できません」等の文面が表示されてしまいます。
そこで、絶対に移動・削除の行わない場所(“C:\”)を参照して、フォルダが使用できなくなるのを防いでいます。(fName = Dir(“C:\”))
まとめ
以上、ファイル名を一括で取得したい! という場合のサンプルでした。
マクロを入力しているExcelを書き出し除外する(if文を追加)、特定の条件のファイル名のみ取得(ワイルドカードを使用)などを行うと更に便利になると思います。
それでは。
コメント