指定したフォルダ内のファイル名全てを取得(Excel VBA)

【本日のミッション】

Excel VBAにて指定したフォルダ内のファイル名全てを取得し、Excelのシートに書き出せ

今日からしばらくこのシリーズをお送り致します。

ミッションの概要

今回指定フォルダにするのはこちらです。

この第1階層フォルダに入っている、3つのファイル名をExcelシートに書き出そうというミッションです。

ファイルの準備とプロシージャ

Excelマクロ有効ブック(.xlsm)のファイルを新規作成します。

そのファイルのシートに下記の通り、フォルダのパスを入力するセル(A3)、取得したファイル名を書き出すセル(6行目1列目)を準備します。

フォルダパスには、ファイル名を取得したいフォルダのフルパスを入力します。

このシートをアクティブにした状態で、Alt+F11でVsual Basic Editerを起動します。

[挿入]-[標準モジュール]で新規モジュールを作成し、下記の通りコードを記入します。

Sub 指定したフォルダ内のファイル名を全て取得()
    'アクティブシートから処理対象のフォルダパスを取得し
    'そのフォルダ内のファイル名を全てアクティブシートに取得
    '【変数】
    Dim ws As Worksheet '処理対象シート
    Dim fn As String    'ファイル名
    Dim t_row As Long   '処理ターゲット行
    Dim pt As String    '処理対象パス

    '■変数セット
    Set ws = ActiveSheet '変数ws=アクティブシートをセット
    pt = ws.Range("A3")  '変数ptにセルA3のパスをセット
    t_row = 6            '変数t_rowにファイル名を書き出す初めのセルの行番号(6行目)をセット

    fn = Dir(pt & "\*.*") '変数fnに1個目のファイル名を格納
                                'エクセルのみの場合は「*.*」を「*.xlsx」にする

    Do While fn <> ""              'fnが空欄になるまでDo While内の処理を続ける
        ws.Cells(t_row, 1) = fn    'Cells(t_row, 1)にファイル名を書き出し
        t_row = t_row + 1          'ファイル名を書き出すセルの行番号+1(一つ下の行番号)
        fn = Dir()                 '変数fnに次のファイル名を格納(ファイルが無い場合は空欄になる)
    Loop
End Sub

記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。

Excelのシートを見てください。

ファイル名を書き出すセルは6行目の1列目から下に順に書き出すようなコードにしています。

第1階層フォルダに入っている3つのファイル名が書き出されました♪

Dir関数とは

Dir関数は、第1引数に指定したファイル・フォルダが存在する場合、パスを除いたファイル名・フォルダ名を返します。存在しない場合は長さ0の文字列 ”” (空欄)を返します。

Dir(ファイル名・フォルダ名を表す文字列,ファイル・フォルダの属性)

Dir (“C:\VBA\第1階層\File1_1.xlsx”)  の場合

  • ファイルが存在する場合(ファイル名を返す)→  File1_1.xlsx
  • ファイルが存在しない場合(空欄を返す)      →  ””

第1引数にはワイルドカードを使用することができるので、取得したいファイル名・フォルダ名の幅を広げることができます。

Dir(”C:\VBA\第1階層\*.*“)

参考:ワイルドカードとは。使い方いろいろ。(Excel)

第2引数に下記定数(値)を指定することで、特定の属性のオブジェクトのみを取得の対象とすることができます。

定数属性
vbNormal (既定)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory16フォルダ
vbAlias64エイリアスファイル

※4、8はMacでは使えません。また、64はMacintoshのみ使えます。

今回は、規定値となっている標準ファイルを取得するため、第2引数は省略しています。

Dir関数は一度引数を指定すると、次に別の引数を指定するまで、同じ引数に対する処理を行います。

fn=Dir(”C:\VBA\第1階層\*.*”)
fn=Dir()
fn=Dir()

1行目の処理では、変数fnに「C:\VBA\第1階層\*.*」に一致するファイルが存在すれば、そのファイル名を返します。

2行目以降の「fn=Dir()」では引数を指定していませんが、「C:\VBA\第1階層\*.*」に一致する別のファイル名を返します。

その処理を繰り返し、「C:\VBA\第1階層\*.*」に一致するファイルが無くなった時、長さ0の文字列 ”” 空欄 を返します。

何度も「fn=Dir()」を書くのは面倒だし、どのタイミングでファイルが無くなるかわからないので、Do While ~ Loopを使って繰り返し処理を行います。

fn=Dir("C:\VBA\第1階層\*.*”)
Do While fn <> ""         'fnが空欄になるまでDo While内の処理を続ける 
    ~fnで行いたい処理を記述~
    fn = Dir()            '変数fnに次のファイル名を格納(ファイルが無い場合は空欄になる) 
Loop

参考:Dir関数が取得するファイルの順番
参考:Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)

■■■スポンサーリンク■■■