【VBA】フォルダ内にあるファイル名を一覧取得する(Dirコマンド)

任意のフォルダ内にあるファイル一覧を、エクセルのシートに表示するVBAを紹介します。

ファイルの整理や文書作成、資料比較などのために、ファイル名やフォルダ名の一覧を取得したいんです。

そうなると、コマンドプロンプトを起動し、Dirコマンドを実行し、その結果を出力しないといけないですね。

・・・。

コピペのみでフォルダ内のファイル名一覧を表示できるようにしますので、興味があれば解説も読んでみてください。

やってみます!

目次

フォルダ内のファイル名一覧を表示するVBA

Sub ファイル名取得()

Const SEARCH_DIR As String = “C:¥Users¥¥フォルダ名”
Const SEARCH_FILE As String = “
.csv”
Dim tmpFile As String
Dim strCmd As String
Dim buf() As Byte
Dim FileList() As String
Dim myArray() As String
Dim cnt As Long, pt As Long, i As Long

tmpFile = Environ(“TEMP”) & “¥Dir.tmp”

strCmd = “Dir “”” & SEARCH_DIR & “¥” & SEARCH_FILE & _
         “”” /b/s/a:-d > “”” & tmpFile & “”””

With CreateObject(“Wscript.Shell”)
    .Run “cmd /c” & strCmd, 7, True
End With

If FileLen(tmpFile) < 1 Then
    MsgBox “該当するファイルがありません”
    Exit Sub
End If

Open tmpFile For Binary As #1
    ReDim buf(1 To LOF(1))
    Get #1, , buf
Close #1
Kill tmpFile

FileList() = Split(StrConv(buf, vbUnicode), vbCrLf)

cnt = UBound(FileList)

ReDim myArray(1 To cnt, 1 To 2)
For i = 1 To cnt
    pt = InStrRev(FileList(i – 1), “¥”)
    myArray(i, 1) = Left(FileList(i – 1), pt)
    myArray(i, 2) = Mid(FileList(i – 1), pt + 1)
Next i

Sheets(“ファイル名”).Select
Cells.ClearContents
Range(“A1”).Value = “パス”
Range(“B1”).Value = “ファイル名”
Range(“A2”).Resize(cnt, 2).Value = myArray

End Sub

フォルダ内のファイル名一覧を表示するVBAの解説

ファイル名を取得する

検索したいフォルダ名を記入(フォルダの中にフォルダが存在しても可)
例:Cドライブ→Usersフォルダ→*フォルダ→検索したいフォルダ

検索したいファイル名の拡張子を記入(ワイルドカード「*」を使用したファイル名の検索も可能)

フォルダのパスを簡単に取得するには

検索したいフォルダを開き、赤丸のフォルダマークをクリックするとフォルダのパスが表示されるので、コピーしてVBAの記述へ貼り付ける。

検索結果を出力する一時ファイルを指定
C: ¥ Users ¥*****¥ AppData ¥ Local¥Temp ¥ Dir.tmp

TEMPとは

環境変数のこと。

コントロールパネル→システム→システムの詳細設定メニューの「詳細設定」タブ→環境変数 から新規設定や編集が可能。

Dirコマンドに使用する文字列を編集
Dir C: ¥ Users ¥***** ¥フォルダ名¥*.csv /b/s/a:-d > C: ¥ Users ¥***** ¥AppData ¥ Local ¥ Temp
検索したいフォルダ名から
「/b/s/a:-d」=サブフォルダを含む全ファイルのフルパスを列挙(フォルダは除外)し
一時ファイルに出力する

WSHでDirコマンドを実行
Wscript.Shellを使用
プログラムを実行 cmd/c Dir C: ¥ Users¥*****¥フォルダ名¥*.csv /b/s/a:-d > C:¥ Users ¥*****¥ AppData ¥Local¥ Temp

7:ウィンドウを最小化ウィンドウとして表示。アクティブなウィンドウは切り替わらない
True:コマンドの終了を待つ

WSHとは

Windows上で簡易なコンピュータプログラムであるスクリプトを実行できるようにするソフトウェア

出力先に設定した一時ファイルのサイズを確認する
1バイトよりも小さければマクロを終了する

結果を出力した一時ファイルを開き、ナンバーを1とする
LOF(1):ナンバー1としたファイルの長さ(バイト)

ナンバー1としたファイルの値を変数bufに格納する

ファイルを閉じる
一時ファイルを削除する

変数bufをUnicodeに変換し、区切り文字として指定した改行(vbCrLf)ごとに区切る

先程作成したFileListの数

FileListの文字列の後ろから検索して”¥”の位置を取得する
FileListの文字列の左から”¥”までの文字列=パス名
FileListの中の”¥”より右の文字列=ファイル名

配列の値をワークシート「ファイル名」に出力する

シートをクリア

A1に「パス」、B1に「ファイル名」を記入
A2を起点に縦にファイルリストの行数、横に2列だけ範囲を拡張し、myArrayを表示していく

パスとファイル名を分けない場合

「ReDim myArray(1 To cnt, 1 To 2)」以降を削除し次のVBAを記述する

Range(“A1”).Value = “フルパス”
‘Range(“A2”).Resize(cnt, 1).Value = WorksheetFunction.Transpose(FileList)

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

この記事を書いた人

子育てに奮闘しながらも、再びガッツリ走り込める日を夢見るフルタイム会社員。

コメント

コメントする

CAPTCHA


目次
閉じる