久しぶりにマクロ組む機会が出来たので、復習します。
別の方法もあるようだけど、私は使い慣れたFileSystemObjectで。
選択したフォルダ内にある全てのファイルに何かする部分を作ります。
参照設定
参照設定しておけば入力補完が効くのでやっておきます。
参照設定しなくても、宣言する時に型をobjectにすれば使えます。
- VBEを開く
- メニューバーのツールから参照設定を開く
- Microsoft Scripting Runtimeにチェックを入れる
- OKをクリックする
インスタンス化
ファイル操作をするための準備。
参照設定をした場合
Dim fs As FileSystemObject
Set fs = New FileSystemObject
参照設定をしない場合
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
作業するフォルダの指定
FileDialogのmsoFileDialogFolderPickerでフォルダを選択します。
頻度が多くて変更が少ないようなら、Settingsシート作って参照するようにしたほうが楽かもしれません。
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "取り込むファイルのあるフォルダを選択"
If .Show Then
Dim folder_path As String
folder_path = .SelectedItems(1)
End If
End With
指定したフォルダ内全てに処理を行う
ファイルを入れる変数を宣言するとき、参照設定している場合はFileの型が使えます。
参照設定していない場合はここもobjectになります。
参照設定をした場合
Dim f As File
For Each f In fs.getFolder(folder_path).Files
'実行したい処理を入れる
Debug.Print f.Name
Next
参照設定をしない場合
Dim f As Object
For Each f In fs.getFolder(folder_path).Files
'実行したい処理を入れる
Debug.Print f.Name
Next
コード全体
とりあえずフォルダ内のファイル名をイミディエイトウィンドウへ出力するコード。
フォルダーのパスを取得するところは分けました。
Option Explicit
Sub filenameEnumeration()
Dim fs As FileSystemObject: Set fs = New FileSystemObject
Dim folder_path As String
folder_path = selectFolderPath("C:\Users\s\Documents\")
If folder_path = "" Then Exit Sub
Dim f As File
For Each f In fs.getFolder(folder_path).Files
Debug.Print f.Name
Next
End Sub
Function selectFolderPath(Optional initial_path As String = "C:\") As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "取り込むファイルのあるフォルダを選択"
.InitialFileName = initial_path
If .Show Then
selectFolderPath = .SelectedItems(1)
End If
End With
End Function