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*
は、ファイルに適用する任意の条件にすることができます。 例えば:
- フォルダー内のテキスト ファイルのみをループ処理する場合は、次のコマンドを使用します:
Dir("C:\User\testfolder\*.txt")
。 - 名前に
"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つの方法で宣言できます。
-
早期バインディング
初期バインディングは、参照リンク (ライブラリ) が VBA で明示的にチェックまたは追加された場合です。 ライブラリは、VBA の
Tools
>References
から追加できます。モジュールがコンピューターで利用できない場合、実行は失敗します。 アーリー バインディングは、開発およびデバッグ プロセスに非常に役立ちます。
オブジェクト メソッド、プロパティ、および名前付き定数の Intellisense エディターの提案を提供します。 さらに、遅延バインディングよりも高速です。
事前バインディングでは、必要なモジュール/ライブラリを確認し、次の方法でオブジェクトを宣言します。
Dim FSO As FileSystemObject Set FSO = New FileSystemObject
事前バインディングでオブジェクトを宣言する別の方法は次のとおりです。
Dim FSO As New FileSystemObject
-
遅延バインディング
外部ライブラリは遅延バインディングではリンクされません。 参照リンクから独立しているため、マシン間の移植性と互換性に理想的です。
Intellisense エディターは提供されないため、オブジェクト固有の定数を明示的に宣言し、その値によって提供する必要があります。
次の構文を使用して、遅延バインディングでオブジェクトを宣言できます。
Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject")
より良い解決策
Dir
関数を使用したソリューションは、オブジェクトを作成してフォルダーからファイルを取得するソリューションよりもうまく機能します。 Dir
関数を使用したテスト機能は、ファイルにアクセスするオブジェクトを作成するソリューションよりも効率的に機能します。
必要な機能を保存して実行するマクロを作成できます。 Microsoft Office のマクロを使用して、異なるフォルダーに対して同じ機能を実行できます。
まとめ
Microsoft Office アプリケーションは、ユーザーに多数の機能を提供します。 VBA 言語でのプログラミングが追加されたことで、ユーザーは数行のコードで自動化されたタスクを簡単に実行できるようになりました。
特定のフォルダー内のファイルをループする解決策がいくつかあるので、探索を続けてください。
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