【VBA】フォルダ内のファイルを一括処理する

 昨今は様々な表計算アプリが出てきていますが、それでもExcelを扱っている会社は少なくないと思います。Excelファイルを使っている会社では、一覧や台帳、申請関連や経理関連など、多くのExcelファイルが存在しているのではないでしょうか?

そんな複数のExcelファイルを一覧にしたい時など、フォルダにまとめて入れて一括処理する方法を説明していきたいと思います。

Dir関数

 フォルダ内のファイルを検索するにはDir関数を使用します。Dir関数は指定されたパス内のファイルやフォルダを順次取得するために使用されます。

構文

Dir([path], [attributes]) As String

引数

path取得するファイルまたはフォルダが存在するパスを指定します。省略された場合、前回の呼び出しの状態が保持されます。
attributes取得するファイルやフォルダの属性を指定します。省略された場合、すべてのファイルやフォルダが対象となります。
引数

 attributesにはVbAttribute型を指定します。

vbNormal通常のファイルまたはフォルダを対象とします。
vbReadOnly読み取り専用のファイルまたはフォルダを対象とします。
vbHidden隠しファイルまたはフォルダを対象とします。
vbSystemシステムファイルまたはフォルダを対象とします。
vbDirectoryフォルダを対象とします。
vbArchiveアーカイブ属性のファイルを対象とします。
VbAttribute型

フォルダ内のファイルを一括処理する

 それではフォルダ内のファイルを一括処理していくコードを見ていきましょう。

Public Sub ReadFiles()

    Dim fp As String
    Dim fn As String
    Dim wb As Workbook
    Dim ws As Worksheet
    
    ' フォルダのパスを指定する
    fp = "フォルダパス\"
    
    ' フォルダ内ファイルを指定する
    fn = Dir(fp & "*.*")
    
    Do While fn <> ""
        ' ファイルを開く
        Set wb = Workbooks.Open(fp & fn)
        
        ' ここに処理を記述する
        
        ' ファイルを閉じる
        wb.Close SaveChanges:=False
        
        ' 次のファイルを取得する
        fn= Dir
    Loop
    
End Sub

 ここで注意点が1つあります。最初に呼び出したDir関数ではpathを指定していますが、2回目以降のDir関数ではpathの指定はしないということです。2回目以降は最初の設定を保持し、すべてのファイルが検索されるまでファイル名を返し続けます。もし、ループ内でpathを渡してしまうと最初からの検索となり、無限ループとなってしまうので注意してください。

コメント

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