Loki's Note

色々なことに手を出して迷子中の私のための記録

【Excel VBA】フォルダ内のファイル全てを処理する方法

post-featured-image

久しぶりにマクロ組む機会が出来たので、復習します。

別の方法もあるようだけど、私は使い慣れたFileSystemObjectで。

選択したフォルダ内にある全てのファイルに何かする部分を作ります。

目次

参照設定

参照設定しておけば入力補完が効くのでやっておきます。

参照設定しなくても、宣言する時に型をobjectにすれば使えます。

  1. VBEを開く
  2. メニューバーのツールから参照設定を開く
  3. Microsoft Scripting Runtimeにチェックを入れる
  4. 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