【コピペで使える】VBA初心者向け、Dir関数の使い方!複数ファイルの取得から存在確認まで

Excel VBA 入門

Dir関数って結局何の関数なのかわからない…
Dit関数で何ができるのかを知りたい!

エクセルVBAに標準搭載されている「Dir関数」は、ファイル操作を行う上でとても重要な関数です。本記事では、Dir関数の概要・使い方を詳しく解説してきます。

またプログラミング初心者でもそのまま使える「Dir関数のコピペコード」も紹介し、複数ファイルの取得や存在確認といった基本から、実務直結の応用事例までを網羅的に紹介します。

Dir関数を理解して、VBA作成レベルをワンランクアップさせましょう!

【まずはコピペ】Dir関数で複数ファイルを取得するVBAコード

まずは、Dir関数を使ったファイル一覧取得のコピペコードを紹介します。

以下のコードでは、選択したフォルダ内の全ファイル名をシートに出力を行います。

Sub GetFileNamesInFolder()
    Dim folderPath As String
    Dim fileName As String
    Dim i As Long

    ' フォルダ選択画面を表示してパスを取得
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then
            folderPath = .SelectedItems(1) & "\"
        Else
            Exit Sub
        End If
    End With

    ' Dir関数で最初のファイルを取得
    fileName = Dir(folderPath & "*.*")

    ' シートの1行目に見出しを作成
    ActiveSheet.Range("A1").Value = "ファイル名一覧"
    i = 2

    ' ファイルが見つからなくなるまで処理を繰り返す
    Do While fileName <> ""
        ' A列にファイル名を書き込む
        ActiveSheet.Cells(i, 1).Value = fileName
        i = i + 1
        
        ' 2回目以降は引数を省略して次のファイルを取得
        fileName = Dir()
    Loop

    MsgBox "ファイル名の取得が完了しました。"
End Sub

💻 まだまだあります!実務で使えるコピペコード集

当サイトで紹介している、日々の面倒な作業を自動化するVBA・マクロを一覧ページにまとめています!

VBAのDir関数とは?ファイル取得と存在確認の基本

Dir関数は、指定した条件に一致するファイルやフォルダの名前(文字列)を取得するための、VBAに標準搭載されている関数です。この関数の主な役割は、「ファイルの存在確認」「複数ファイルの連続取得」の2つです。

Dir関数は非常にシンプルなルールで動いており、指定したパスにファイルが存在すればそのファイル名を返し、存在しない場合や取得できるファイルがすべて終わった場合は「空白(””)」を返します。

この性質を利用し、条件分岐(If文)や繰り返し処理(Do While文)と組み合わせることで、様々な自動化マクロを構築していきます。

Dir関数の基本構文と属性の活用

Dir関数の基本的な書き方は以下の通りです。

Dir(ファイルパス, [属性])

単にパスを指定するだけでなく、省略可能な第2引数の「属性」を活用することで検索の幅が広がります。

例えば「vbDirectory」を指定すればファイルではなくフォルダそのものの存在を確認でき、「vbHidden」を指定すれば隠しファイルを検索対象に含めるなど、より実務に沿った柔軟な使い方が可能です。

初心者がつまずきやすい注意点:戻り値の仕様

Dir関数を使用する上で必ず覚えておくべき仕様が、「取得できるのはファイル名のみ」という点です。

例えば、「C:\業務データ\見積書.xlsx」というパスを指定してDir関数を実行した場合、返ってくる結果はフルパスではなく、「見積書.xlsx」というファイル名だけの文字列になります。

そのため、取得したファイルをVBAで開いたり操作したりする際は、元の「フォルダのパス」と取得した「ファイル名」を結合(&)してフルパスを作り直してから処理を行うのが、実務における基本の型となります。

【詳細解説】Dir関数の実践的な使い方とコード例

使い方①:指定したファイルの存在確認

「所定の場所にファイルが存在するか」を確認してから処理を進めるためのコードです。
ファイルがない状態でマクロが動いてエラー停止するのを防ぐ役割を持ちます。

If Dir("C:\業務データ\月次報告書.xlsx") <> "" Then
    MsgBox "ファイルが存在します。処理を続行します。"
Else
    MsgBox "ファイルが見つかりません。"
End If

使い方②:ワイルドカードを活用した特定ファイルの取得

フォルダ内に様々なファイルが混在している場合、ワイルドカード(*)を使います。
例えば「Dir(“C:\業務データ\*.xlsx”)」と書けば、エクセルファイル(.xlsx)だけを正確に抽出できます。「2023_*.xlsx」のように、特定の文字から始まるファイルだけを狙い撃ちすることも可能です。

使い方③:2回目以降の取得時に引数を省略する理由

複数ファイルの取得で最もつまずきやすいのが、この仕様です。

1つ目のファイルを取得する時はパスを指定しますが、2つ目以降は「Dir()」と括弧の中身を空にします。パスを再度指定してしまうと、永遠に1番目のファイルを取得し続ける無限ループに陥るため注意してください。引数を省略することで、自動的に次のファイルを探してくれます。

【実務直結】Dir関数を活用した自動化の参考事例

Dir関数のループ処理を活用すれば、複数ファイルを一気に操作する実用的なマクロが作れます。

当ブログで公開している、実務直結のコピペツール事例を紹介します。

フォルダ内の全エクセルに同じ処理を実行

指定フォルダ内の全エクセルファイルを順番に開き、同じセルにデータを転記するVBAです。

開くエクセルファイルを選択する際に、Dir関数を使っています。

VBAでフォルダ内のファイル名を一括変更!

ファイル名一覧を出力し、隣の列に新しい名前を入力して一括リネームを行うVBAです。

一覧を出力する部分は冒頭のコピペコードとほぼ同じ動作ですが、そこからファイル名変更のVBAとくっつけて使っています。

フォルダ内エクセルを一括統合

バラバラの複数エクセルファイルを読み込み、一つのエクセルファイルにシートとして集約するマクロです。

単純にファイル名を取得するだけでなく、取得したファイルに対しての動作を行っているVBAです。

終了時にVBAで自動バックアップ

VBAのメイン動作ではなく、ファイル確認をしてエラーを防止するような形でもDir関数は活躍します。

このVBAは、エクセル終了時に日時付きのバックアップファイルを自動生成するのがメインの動作ですが、実行前に「保存先フォルダが存在するか」を確認するときにDir関数を使っています。

Dir関数を使う際の注意点

便利なDir関数ですが、「サブフォルダ(フォルダの中のフォルダ)の中身まで探すのが苦手」という弱点があります。階層が深いフォルダを処理しようとすると、コードが極端に複雑になります。複雑なフォルダ階層の処理が必要になった場合は、VBAの「FileSystemObject(FSO)」を活用してください。

また、数百件規模のデータ処理をコンスタントに行いたい場合は、VBAでは動作自体が遅くなりがちです。そうのような大規模なデータ処理を行う場合は、Pythonなどのプログラミング言語へステップアップすることをおすすめします。

エラーの解消や応用にはChatGPTを活用する

自環境に合わせてコードを書き換えた際、「隠しファイルまで取得してエラーになる」といった壁にぶつかることがあります。自力で解決できない時は、ChatGPTを活用してトラブルシューティングを行ってください。

「このDir関数の処理で、拡張子が.tmpのファイルを除外するIf文を追加して」と指示を出すだけで、正確な修正コードを即座に提示してくれます。

まとめ

Dir関数はVBAでエクセルだけでなく、ファイル操作まで行う上では、とても重要な関数です。AI活用により詳細まで覚える必要性は低くなっていますが、便利な関数なので、レベルアップのためにぜひとも活用してみてください。

このブログでは、今回紹介したような内容から、日々の業務を根本からラクにする自動化テクニックまで幅広く紹介しています。

さらに一歩踏み込んで、「毎日の面倒な手作業を最速で終わらせたい!」という方向けに、VBAをイチから学ばず「コピペ×AI」でパパッと自動化するノウハウをまとめたKindle書籍を出版しました。

Kindle Unlimited(読み放題)なら0円で読めますので、ぜひチェックしてみてください!

コメント

タイトルとURLをコピーしました