VBA を使用してフォルダー内のファイルをループする

Bilal Shahid 2023年6月21日
  1. VBA を使用してフォルダー内のファイルをループする
  2. Dir 関数を使用する
  3. ファイル システム オブジェクト を使用する
  4. より良い解決策
  5. まとめ
VBA を使用してフォルダー内のファイルをループする

Visual Basic for Applications は、Microsoft Office 用に設計されたイベント駆動型プログラミング言語です。 タスクを自動化し、要件に応じて機能をカスタマイズできます。

VBA は非常に強力で、ユーザーはわずかなコード ステートメントですべてを実行できます。

この記事では、VBA を使用してフォルダーに保存されているファイルをループする方法について説明します。 以下で 2つの方法について詳しく説明し、コード スニペットを示します。

VBA を使用してフォルダー内のファイルをループする

VBA を使用すると、ユーザーは特定のディレクトリに保存されているファイルをループして、ファイルの名前、タイムスタンプ、拡張子などを取得できます。たとえば、新しいファイルの作成や古いファイルの変更など、ディレクトリにアクセスして任意のアクションを実行できます。

この記事では、アクセス時間が異なる 2つのソリューションについて説明しました。 VBA では、ユーザーは Dir 関数を使用してフォルダー内のファイルをループし、File System Object を作成できます。

さまざまなソリューションについて以下で説明します。

Dir 関数を使用する

次のコード スニペットを使用すると、ユーザーは Dir 関数を使用してフォルダー内のファイルをループできます。 Dir 関数は、ディレクトリ関数として知られています。

これは、ファイルのパスをパラメーターとして受け取り、ファイルの名前を返す組み込みの VBA 関数です。

パスがフォルダを表す場合、Dir 関数はパスに保存されている最初のファイルの名前を返します。 次のコード スニペットは、Dir 関数がフォルダー内のファイルをループするのにどのように役立つかを表しています。

Sub example()
    Dim fileName As Variant
    fileName = Dir("C:\User\testfolder\")

    Do While Len(fileName) > 0

        ' Insert any action that must be performed on each file.

        Debug.Print fileName
        ' Prints file name to the immediate window

        fileName = Dir
        ' Set the file name to the next file name

    Loop

End Sub

注: これはコード スニペットであり、コード全体ではありません。 必要に応じて編集できます。

Dir 関数は、迅速かつ効率的なソリューションを提供します。 また、アクセス速度も速いです。

フォルダー内の特定のファイルのみをループしたい場合は、Dir 関数を使用して test 条件を適用できます。 Dir 関数で test 条件を使用するための構文を以下に示します。

Dir("C:\User\testfolder\*test*")

*test* は、ファイルに適用する任意の条件にすることができます。 例えば:

  1. フォルダー内のテキスト ファイルのみをループ処理する場合は、次のコマンドを使用します: Dir("C:\User\testfolder\*.txt")
  2. 名前に "Finance" を含むファイルのみをループ処理する場合は、次のコマンドを使用します: Dir("C:\User\testfolder\*Finance*")

注: Dir 関数の引数は、隠しファイル、システム ファイルなど、さまざまな種類のファイルを返すように変更することもできます。

ファイル システム オブジェクト を使用する

2 番目の解決策は、ファイル システム オブジェクト (FSO) を作成して、フォルダーに格納されているファイルをループします。 FSO のさまざまな機能を使用して、フォルダーに格納されているファイルをループ処理します。

コード スニペットを以下に示します。

Sub example()
   Dim Obj As Object, Source As Object, file As Variant
   Set Obj = CreateObject("Scripting.FileSystemObject")
   Set Source = Obj.GetFolder("C:\User\testfolder\")

   For Each file In Source.Files

      If InStr(file.Name, ".txt") > 0 Then
	      Debug.Print file.Name
      End If

   Next file
End Sub

コード スニペットは、特定のフォルダーのパスで Source を設定します。 次に、For Each ループを使用して、フォルダー内のすべてのファイルをループ処理します。

フォルダー内のすべてのファイルをループ処理したくない場合は、InStr(file.name, "test") > 0 コマンドを使用してテキストを指定し、ファイルを除外します。 条件が true を返す場合、それらの特定のファイルに対して実行する必要があるアクションは、if ステートメント内で言及されます。

ただし、上記のコード スニペットには 1つの問題があります。

コードの関数 file.name の実行時間が遅い。 回答がユーザーに返されるまでに数秒かかります。

特定のファイルを除外するためにテストを使用していない場合は、file.name 関数は必要ありません。 その場合、それは理想的に機能します。

上記のコード スニペットを使用して、フォルダー内のすべてのファイルを簡単かつ迅速にループできます。

FSO アーリー バインディングとレイト バインディング

ファイル システム オブジェクト は、アーリー バインディングとレイト バインディングの 2つの方法で宣言できます。

  1. 早期バインディング

    初期バインディングは、参照リンク (ライブラリ) が VBA で明示的にチェックまたは追加された場合です。 ライブラリは、VBA の Tools > References から追加できます。

    モジュールがコンピューターで利用できない場合、実行は失敗します。 アーリー バインディングは、開発およびデバッグ プロセスに非常に役立ちます。

    オブジェクト メソッド、プロパティ、および名前付き定数の Intellisense エディターの提案を提供します。 さらに、遅延バインディングよりも高速です。

    事前バインディングでは、必要なモジュール/ライブラリを確認し、次の方法でオブジェクトを宣言します。

    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    

    事前バインディングでオブジェクトを宣言する別の方法は次のとおりです。

    Dim FSO As New FileSystemObject
    
  2. 遅延バインディング

    外部ライブラリは遅延バインディングではリンクされません。 参照リンクから独立しているため、マシン間の移植性と互換性に理想的です。

    Intellisense エディターは提供されないため、オブジェクト固有の定数を明示的に宣言し、その値によって提供する必要があります。

    次の構文を使用して、遅延バインディングでオブジェクトを宣言できます。

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    

より良い解決策

Dir 関数を使用したソリューションは、オブジェクトを作成してフォルダーからファイルを取得するソリューションよりもうまく機能します。 Dir 関数を使用したテスト機能は、ファイルにアクセスするオブジェクトを作成するソリューションよりも効率的に機能します。

必要な機能を保存して実行するマクロを作成できます。 Microsoft Office のマクロを使用して、異なるフォルダーに対して同じ機能を実行できます。

まとめ

Microsoft Office アプリケーションは、ユーザーに多数の機能を提供します。 VBA 言語でのプログラミングが追加されたことで、ユーザーは数行のコードで自動化されたタスクを簡単に実行できるようになりました。

特定のフォルダー内のファイルをループする解決策がいくつかあるので、探索を続けてください。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

関連記事 - VBA File