こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
ふとデスクトップに目を向けると、画面の下にExcelのアイコンがずらーっと並んでいる……。そんな光景を見ただけで、「はぁ……」とため息をついてしまうことはありませんか?
- 「この10個のファイル、全部開いて中身を確認しなきゃ」
- 「全部のファイルから売上データだけコピーしてまとめなきゃ」
こうした作業は、単純でありながら非常に神経を使うものです。ミスは許されないけれど、数は膨大。
そんなストレスフルな状況を打破するのが、今回ご紹介するVBAのテクニックです。
「開いているブックをループする」とは?仕組みをイメージで理解しよう
今回は、VBAを使って「開いている全てのブック(ファイル)を順番に処理する」方法をお伝えします。
「開いているブックをループする」と言われても、最初はピンとこないかもしれません。 そこで、あなたの机の上に、確認が必要な書類の束(=開いているExcelファイルたち)があると想像してみてください。
手作業でこれを行う場合、以下のような動きになりますよね。
- 1枚目の書類を取る
- 内容をチェックする
- 机の横に置く
- 2枚目の書類を取る……(以下、最後まで繰り返し)
これをVBA(マクロ)に指示すると、こうなります。 「そこにある書類を、端から順番に全部チェックしておいて」
これだけです。
これをプログラミングの世界では「コレクションのループ処理(For Each)」と呼びます。
コピペで即戦力!全ブック名を取得するサンプルコード
では、実際にコードを見てみましょう。
今回は最もシンプルで分かりやすい例として、「今開いている全てのExcelファイル名を、セルに書き出す」というコードを用意しました。
このマクロを実行すれば、たとえ10個、20個のファイルが開いていても、1秒かからずにリストアップが完了します。
以下のコードを標準モジュールにコピペしてみてください。
Sub 開いている全てのブック名を取得する()
Dim wb As Workbook
Dim i As Long
' 書き出し位置の初期設定(A1セルからスタート)
i = 1
' 開いている全てのブックに対して繰り返し処理を行う
For Each wb In Workbooks
'マクロを実行している自分自身のファイルは除外する
If wb.Name <> ThisWorkbook.Name Then
' A列にブックの名前を書き出す
Cells(i, 1).Value = wb.Name
' 次の行へ移動
i = i + 1
End If
Next wb
MsgBox "全てのブックを確認しました!"
End Sub
コード解説
このコードの主役は、以下の3行です。
For Each wb In Workbooks
' ここに実行したい処理を書く
Next wb
- Workbooks: 今Excelで開いている「すべてのファイル」の集まり(コレクション)です。
- wb: 1つひとつのファイルを取り出して入れておくための「一時的な箱」です。
- For Each: 「集まりの中から1つ取り出して箱に入れ、中身の処理が終わったら次へ。全部終わるまで繰り返して!」という命令です。
トランプの山(Workbooks)から、1枚ずつカード(wb)をめくって確認していく様子をイメージすると分かりやすいでしょう。
運用上のコツ:自分自身を除外する理由
コードの中に If wb.Name <> ThisWorkbook.Name Then という一文を入れました。
これは「今このマクロが書かれているファイル自身は、処理の対象から外す」という重要な設定です。
集計用のファイル(マクロ本体)まで集計対象に含めてしまうと、データが重複したり、思わぬエラーの原因になったりすることがあります。この一文を入れておくだけで、マクロの安定性がグッと高まります。
ぜひ、日々の業務に役立ててみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント