For Each…Nextで繰り返し処理する
複数のエクセルファイルにデータの書き込みなどをした後、まとめて上書き保存・閉じる場合は、For Each…Nextですべてのエクセルファイルを1つずつ処理していきます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'処理対象のエクセルファイル Dim targetExcelFile As Workbook '開いているエクセルファイルを、繰り返し処理で1つずつ処理する For Each targetExcelFile In Workbooks '処理対象のエクセルファイル名と、VBAのファイル名を比較し、違う時のみ処理を行う If targetExcelFile.Name <> ThisWorkbook.Name Then 'ファイルを上書き保存 targetExcelFile.Save 'ファイルを閉じる targetExcelFile.Close End If Next |
解説
VBAが記述されているエクセルファイル自体が途中で閉じられると、そこで処理が終了してしまいます。
そのため、VBAが記述されているエクセル以外を、「上書き保存」→「閉じる」と1つずつ繰り返し処理しています。
POINT
VBAのエクセルファイル名は、ThisWorkbook.Nameで調べることができます。
VBAのあるエクセルファイルも閉じる
ループ処理が終わった後(Nextの後)に、VBAのファイルを閉じるプログラムを書きます。
1 2 3 4 |
'VBAのファイルは最後に閉じる ThisWorkbook.Close |
ただし、この書き方だとエクセルのアプリケーションが残ってしまうので、実際は次の「エクセル自体を終了する」が実用的です。
エクセル自体を終了する
ループ処理が終わった後(Nextの後)に、Excel自体を終了するプログラムを書きます。
1 2 3 4 |
'Excel自体を終了する Application.Quit |
VBAのエクセルファイルも保存する必要がある場合は、Application.Quitの直前にThisWorkbook.Saveを書きます。
注意すること
すべてのエクセルファイルを閉じる場合、VBAが書かれているエクセルファイルは最後に閉じましょう。