Excel-VBAでフォルダやファイルを操作する方法を3回の記事にわけて紹介します。
(1)FileSytemObjectを使用する準備
(2)フォルダ内にあるサブフォルダとファイルを操作する ― 今回の記事
(3)すべての下位フォルダ内のファイルを操作する
1回目の前回はFileSystemObjectを使うための準備を紹介しました。今回は2回目の記事としてFileSystemObjectを使って実際にフォルダオブジェクトとファイルオブジェクトを操作する方法を紹介します。
フォルダオブジェクトの取得
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)すべての下位フォルダ内のファイルを操作する
コメント