LoginSignup
32
41

More than 3 years have passed since last update.

VBA:フォルダ内のファイルを順次処理

Last updated at Posted at 2018-12-18

Excel VBAで個人的に使う短いコードを集めてみます。思いついたら適宜追加します。

フォルダ内のファイルを順次処理

Dir関数を使う方法と、FSO(ファイルシステムオブジェクト)を使う方法があります。現代人は後者です。この書き方であれば参照設定は不要です。

パスの区切りは、Windowsでは通常バックスラッシュ(半角の\)あるいは円マーク(半角の¥)ですが、ここではふつうのスラッシュ(半角の/)でも大丈夫です。Macを併用する場合は、トラブルの原因になるのでスラッシュにしておくといいかも。

パス文字列の最後にも区切り文字が必要です。エクスプローラからパスをコピペしたときには、最後の区切り文字は付いてこないのでハマりどころです。

files.bas
Sub OpenFilesInFolder()

    Dim path, fso, file, files
    path = "C:/Users/xxxxxx/フォルダ名/"
    'path = ThisWorkbook.Path & "/フォルダ名/"  '相対パスの場合
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set files = fso.GetFolder(path).files

    'フォルダ内の全ファイルについて処理
    For Each file In files

        'ファイルを開いてブックとして取得
        Dim wb As Workbook
        Set wb = Workbooks.Open(file)

        'ブックに対する処理

        '保存せずに閉じる
        Call wb.Close(SaveChanges:=False)

    Next file

End Sub

以上はファイルを開いて、Excelのブックとして処理をする場合の書き方です。テキストファイルとして処理をする場合の書き方は「VBA FSO OpenTextFile」あたりで検索してください。

なお、複数のブックに対して処理をするもっとも簡単な方法は、処理対象ブックを全て開いておくことです。開かれているブックは Workbooks コレクションに入っているので、下のように書けば、現在開いている全てのブックに対して処理を行うことができます。

files_2.bas
    Dim wb As Workbook
    For Each wb In Workbooks
        'ブックに対する処理
    Next wb

追記:Word VBA でも同様の書き方が可能ですが、Documents.Openの引数をfile.pathとする必要があるようです。

files_word.bas
    For Each file In files
        Dim doc As Document
        Set doc = Documents.Open(file.path)
        'ドキュメントに対する処理
        Call doc.Close(SaveChanges:=False)
    Next file
32
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
41