みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「フォルダ内のファイル情報を取得」です。
大量のファイルを開いて値を読み取る際に重宝するテクニックになります。
【目次】
それでは、始めましょう!
フォルダ内のファイル情報を取得するには?
大量のExcelシートを開いてそこから値を取得する、という作業がデスクワークではよくあります。
たとえば、全員から集めたアンケートのExcelファイルから値を集計する作業などです。
ひとつひとつ手作業でやっていくとなかなか骨の折れる作業ですが、この作業はマクロ化しやすいと言えます。
具体的にどうやるかというと、「FileSystemObject」というオブジェクトを使います。
このオブジェクトは、コンピュータのファイルシステムをVBAで利用する機能を持っています。
構文
FileSystemObjectを使用する場合、まずは変数にオブジェクトを定義します。
Set FSO = CreateObject("Scripting.FileSystemObject")
これで、FSOという変数をFileSystemObjectオブジェクトとして使用できるようになります。
続いて、フォルダ内のファイル群にアクセスする構文です。
FSO.GetFolder([フォルダパス]).Files
FileSystemObjectは、GetFolderメソッドで括弧内に指定したフォルダを参照します。
GetFolderメソッドを使うと、Filesコレクションが扱えるようになり、これはフォルダ内のファイル群になります。
そして、Filesコレクションからファイルひとつひとつへアクセスするには、Forステートメントを使用します。
For Each objFile In FSO.GetFolder([フォルダパス]).Files
For Eachは、In句の後ろのコレクションからオブジェクトをひとつずつ取り出し、すべて取り出し終えるまで繰り返します。
取り出されたオブジェクトはobjFile変数に格納されます。
objFileはフォルダ内にあるファイルにアクセスできるので、ファイルを開くためのパスを取得できます。
パスの値を取得するには、Pathプロパティを参照します。
objFile.Path
ファイルの名前を参照するには、Nameプロパティを使います。
objFile.Name
これで、フォルダ内のファイルに対してアクセスできるようになりました。
以下の使用例で、上記の構文を組み合わせたソースコードを確認しましょう。
使用例
以下の使用例では、過去記事で紹介した「Application.FileDialogオブジェクト」の使用例①「フォルダ選択ダイアログを表示する」のコードを一部使っています。
使用例① 指定したフォルダに存在するファイルのパスを表示する
イミディエイトウインドウにフォルダパスを出力します。
Sub ExcelVBA_011_Example1() 'フォルダ選択ダイアログを表示する Dim objFD Set objFD = Application.FileDialog(msoFileDialogFolderPicker) 'オブジェクトを定義 With objFD .InitialFileName = "D:\" 'ダイアログで表示する初期フォルダを指定 If .Show = False Then 'ダイアログ表示⇒キャンセルボタンが押された場合 MsgBox "キャンセルされました", vbInformation 'メッセージ表示 Exit Sub End If End With 'フォルダ内のファイル名を出力する Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを定義する Dim objFile As Object For Each objFile In FSO.GetFolder(objFD.SelectedItems(1)).Files Debug.Print objFile.Path Next End Sub
使用例② 指定したフォルダに存在するExcelファイルを開く
ファイルの先頭5文字をLeft関数、拡張子をRight関数で確認し、アンケートのExcelファイルを開きます。
ファイルのパスでなくファイル名を参照するには、objFileオブジェクトのNameプロパティを参照しましょう。
ExcelファイルはWorkbooks.Openメソッドで開けます。
Sub ExcelVBA_011_Example2() 'フォルダ選択ダイアログを表示する Dim objFD Set objFD = Application.FileDialog(msoFileDialogFolderPicker) 'オブジェクトを定義 With objFD .InitialFileName = "D:\" 'ダイアログで表示する初期フォルダを指定 If .Show = False Then 'ダイアログ表示⇒キャンセルボタンが押された場合 MsgBox "キャンセルされました", vbInformation 'メッセージ表示 Exit Sub End If End With 'フォルダ内のExcelファイルを開く Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを定義する Dim objFile As Object For Each objFile In FSO.GetFolder(objFD.SelectedItems(1)).Files If Left(objFile.Name, 5) = "アンケート" And Right(objFile.Name, 4) = "xlsx" Then Workbooks.Open objFile.Path 'ファイルを開く End If Next End Sub
使用例③ 開いたファイルから値を取得する
開いたアンケートから回答を読み取り、イミディエイトウインドウに出力します。
開いたばかりのExcelファイルを閉じるには、ActiveWorkbook.Closeが有効です。
これはアクティブ(選択中)なExcelファイルを閉じるメソッドです。
Sub ExcelVBA_011_Example3() 'フォルダ選択ダイアログを表示する Dim objFD Set objFD = Application.FileDialog(msoFileDialogFolderPicker) 'オブジェクトを定義 With objFD .InitialFileName = "D:\" 'ダイアログで表示する初期フォルダを指定 If .Show = False Then 'ダイアログ表示⇒キャンセルボタンが押された場合 MsgBox "キャンセルされました", vbInformation 'メッセージ表示 Exit Sub End If End With 'フォルダ内のExcelファイルを開いて情報取得する Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを定義する Dim objFile As Object For Each objFile In FSO.GetFolder(objFD.SelectedItems(1)).Files If Left(objFile.Name, 5) = "アンケート" And Right(objFile.Name, 4) = "xlsx" Then Workbooks.Open objFile.Path 'ファイルを開く Debug.Print objFile.Name, Range("D11").Value, Range("D16").Value '回答欄の値を出力 ActiveWorkbook.Close 'ファイルを閉じる End If Next End Sub
終わりに
以上、フォルダ内のファイル情報を参照するマクロの解説でした。
使用例③で紹介しているような、開いたファイルから値を取得するマクロは、値の集計表作成などに発展させることができます。
集計表を作成するマクロは、次回以降解説していきたいと考えています。
それでは、また次回お会いしましょう!