ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.11

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。

今回紹介するのは、「フォルダ内のファイル情報を取得」です。
大量のファイルを開いて値を読み取る際に重宝するテクニックになります。

【目次】

  1. フォルダ内のファイル情報を取得するには?
  2. 構文
  3. 使用例
  4. 終わりに

それでは、始めましょう!

フォルダ内のファイル情報を取得するには?

大量の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オブジェクト」の使用例①「フォルダ選択ダイアログを表示する」のコードを一部使っています。

技術記事:ExcelVBAで仕事を効率化しようVol.10

使用例① 指定したフォルダに存在するファイルのパスを表示する
イミディエイトウインドウにフォルダパスを出力します。

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

終わりに

以上、フォルダ内のファイル情報を参照するマクロの解説でした。
使用例③で紹介しているような、開いたファイルから値を取得するマクロは、値の集計表作成などに発展させることができます。
集計表を作成するマクロは、次回以降解説していきたいと考えています。

それでは、また次回お会いしましょう!