【VBAでフォルダ/ファイル操作】(2)フォルダ内にあるサブフォルダとファイルを操作する

ノートPC
この記事は約5分で読めます。

Excel-VBAでフォルダやファイルを操作する方法を3回の記事にわけて紹介します。

(1)FileSytemObjectを使用する準備
(2)フォルダ内にあるサブフォルダとファイルを操作する  ― 今回の記事
(3)すべての下位フォルダ内のファイルを操作する

1回目の前回はFileSystemObjectを使うための準備を紹介しました。今回は2回目の記事としてFileSystemObjectを使って実際にフォルダオブジェクトとファイルオブジェクトを操作する方法を紹介します。

記事中のサンプルコードは「事前バインディング」によるコードになっています。参照設定で「Microsoft Scripting Runtime」を適用して使用してください。
実行時バインディング」で使用したい場合は変数の宣言とオブジェクト作成の箇所を変更してください。詳しくは第1回の記事を参照してください。

フォルダオブジェクトの取得

FileSytemObjectを使ってフォルダを操作するにはGetFolderメソッドでフォルダオブジェクトを取得します。

.GetFolder(“フォルダパス”)

GetFolderメソッドは引数にフォルダのパスを指定することでそのフォルダオブジェクトを返します。

サブフォルダコレクションからサブフォルダを操作

さらにそのフォルダオブジェクトにSubFoldersプロパティを使うことでフォルダ内のサブフォルダのオブジェクトコレクションを取得することができます。

これにFor Each..Nextステートメントを使うことでサブフォルダのフォルダオブジェクトをひとつずつ取り出して操作できます。

“D:\sample”フォルダ内にあるすべてのサブフォルダのパスを取得するコードは次のようになります。

Sub sample1()
    Dim folderPath As String
    Dim fso As FileSystemObject
    Dim objFolder As Folder
    folderPath = "D:\sample"
    Set fso = New FileSystemObject
    '//フォルダ内のサブフォルダパスを取得
    For Each objFolder In fso.GetFolder(folderPath).SubFolders
        Debug.Print objFolder.Path
    Next
End Sub

ファイルコレクションからファイルオブジェクトを操作

またSubFoldersプロパティの代わりにFilesプロパティを使うとフォルダ内のファイルオブジェクトコレクションを取得できます。

さきほどのコードにフォルダ内のファイルのパスを取得するコードを追加してみましょう。

Sub sample2()
    Dim folderPath As String
    Dim fso As FileSystemObject
    Dim objFolder As Folder
    Dim objFile As File
    folderPath = "D:\sample"
    Set fso = New FileSystemObject
    '//フォルダ内のサブフォルダパスを取得
    For Each objFolder In fso.GetFolder(folderPath).SubFolders
        Debug.Print objFolder.Path
    Next
    '//フォルダ内のファイルパスを取得
    For Each objFile In fso.GetFolder(folderPath).Files
        Debug.Print objFile.Path
    Next
End Sub

特定のファイルを操作する方法

すべてのファイルではなくExcelブックだけを対象にしたい場合はIfステートメントを使って条件分岐させます。拡張子が「.xlsx」や「.xlsm」のものを対象にすればよいので、Instr関数を使ってファイル名に「.xls」を含むかどうかで判別します。

If Instr(objFile.Name, “.xls”) > 0 Then 処理

また他のExcelブックを開いてデータを取り込むといった場合でマクロを実行するブックが同じフォルダ内にある場合、操作する対象から自身のブックを除外するには同じくIfステートメントとInstr関数で条件分岐します。

If Instr(objFile.Name, ThisWorkbook.Name) = 0 Then 処理

先述のサンプルコードにこの2つの条件(自身以外のExcelブックを対象にする)を追加したコードは次のようになります。

Sub sample3()
    Dim folderPath As String
    Dim fso As FileSystemObject
    Dim objFolder As Folder
    Dim objFile As File
    folderPath = "D:\sample"
    Set fso = New FileSystemObject
    '//フォルダ内のサブフォルダパスを取得
    For Each objFolder In fso.GetFolder(folderPath).SubFolders
        Debug.Print objFolder.Path
    Next
    '//フォルダ内のファイルパスを取得(自身以外のExcelブックを対象)
    For Each objFile In fso.GetFolder(folderPath).Files
        If InStr(objFile.Name, ".xls") > 0 Then
            If InStr(objFile.Name, ThisWorkbook.Name) = 0 Then
                Debug.Print objFile.Path
            End If
        End If
    Next
End Sub

まとめ

今回はFileSystemObjectを使ってフォルダ内にあるサブフォルダやファイルを操作する方法を紹介しました。

次回はここからさらにサブフォルダ内のファイルやさらに下位のフォルダを含めすべてのファイルを操作する方法を紹介します。

(1)FileSytemObjectを使用する準備
(2)フォルダ内にあるサブフォルダとファイルを操作する  ― 今回の記事
(3)すべての下位フォルダ内のファイルを操作する

コメント

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