Workbook は「1つの Excel ファイルそのもの」
まずイメージからいきます。
Workbook オブジェクト = 1つの Excel ファイルそのもの です。
拡張子が .xlsx や .xlsm の「ファイル1個」が、そのまま Workbook に対応します。
そして、複数開いているブック全体をまとめたものが Workbooks(コレクション)です。
- Workbook:1冊のブック
- Workbooks:開いているブック全部の集合
という関係になっています。
VBA では、Workbook をきちんと意識できるようになると、
「どのファイルを触っているのか」がハッキリして、バグが一気に減ります。
Workbook を変数として扱う基本パターン
変数宣言と「今のブック」を入れてみる
まずは、Workbook 型の変数を宣言します。
Dim wb As Workbook
VBそして、今このコードが書かれているブック(ThisWorkbook)を入れてみます。
Sub SampleWorkbookBasic()
Dim wb As Workbook
Set wb = ThisWorkbook ' このマクロが保存されているブック
MsgBox "このブックの名前は " & wb.Name & " です。"
End Sub
VBここでのポイントは、
ThisWorkbook:このマクロが保存されているブック
ActiveWorkbook:今アクティブ(ユーザーが触っている)ブック
という違いがあることです。
マクロ用のブックと、ユーザーが操作しているブックが別になることも多いので、
「どっちを触りたいのか」を意識して使い分けます。
特定のブックを名前でつかまえる
すでに開いているブックを名前で取得
すでに開いているブックに対して処理したいときは、Workbooks("名前") から Workbook を取り出します。
Sub SampleWorkbookByName()
Dim wb As Workbook
Set wb = Workbooks("売上集計.xlsx")
wb.Activate
MsgBox "今アクティブにしたブックは " & wb.Name & " です。"
End Sub
VBここで重要なのは、
Workbooks("売上集計.xlsx")は「その名前の Workbook を1つ返す」- それを
Setでwbに入れている
という流れです。
「このファイル名のブックに対して処理したい」というときの基本形になります。
新しいブックを作る・既存ブックを開く・保存する・閉じる
新しいブックを作る(Add)
Sub SampleWorkbookAdd()
Dim wb As Workbook
Set wb = Workbooks.Add ' 新しいブックを1冊作る
wb.Worksheets(1).Range("A1").Value = "新規ブックです"
End Sub
VBWorkbooks.Add の戻り値が「作られたばかりの Workbook」なので、
それを wb に受け取ってから操作すると分かりやすくなります。
既存ファイルを開く(Open)
Sub SampleWorkbookOpen()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Data\売上集計.xlsx")
MsgBox "開いたブックは " & wb.Name & " です。"
End Sub
VBWorkbooks.Open(フルパス) でファイルを開き、
開かれた Workbook を wb に入れて、その後の処理に使います。
保存する(Save / SaveAs)
Sub SampleWorkbookSave()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Save ' 上書き保存
End Sub
VB別名で保存したい場合は SaveAs を使います。
wb.SaveAs "C:\Data\バックアップ.xlsx"
VB閉じる(Close)
Sub SampleWorkbookClose()
Dim wb As Workbook
Set wb = Workbooks("売上集計.xlsx")
wb.Close ' 保存するかどうかの確認ダイアログが出る
End Sub
VB確認ダイアログを出したくない場合は、DisplayAlerts を使うパターンもありますが、
超初心者のうちは「まずは素直に Close してみる」で十分です。
Workbook から Worksheet や Range へ“たどる”感覚
「どのブックの、どのシートの、どのセルか」をはっきりさせる
Workbook を変数に持っていると、
その配下の Worksheet や Range に、はっきりと道筋をつけてアクセスできます。
Sub SampleWorkbookToSheet()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上集計.xlsx")
Set ws = wb.Worksheets("集計")
ws.Range("A1").Value = "テスト"
End Sub
VBここでの流れは、
Workbooks(“売上集計.xlsx”) → そのブック(Workbook)
その中の Worksheets(“集計”) → そのシート(Worksheet)
その中の Range(“A1”) → セル A1
という階層構造です。
この「上から順にたどる」感覚が身につくと、
「どのブックのどのシートを触っているのか」が明確になり、
ActiveSheet や Select に頼らない、安定したコードが書けるようになります。
ThisWorkbook と ActiveWorkbook の違いをもう一度整理
ThisWorkbook:マクロが保存されているブック
Set wb = ThisWorkbook
VBThisWorkbook は、「この VBA コードが保存されているブック」です。
マクロ用の管理ブックから、別のデータブックを操作するようなときに、
「自分自身(マクロブック)」を指すのに使います。
ActiveWorkbook:今ユーザーが触っているブック
Set wb = ActiveWorkbook
VBActiveWorkbook は、「今アクティブなブック」です。
ユーザーがどのブックを選んでいるかによって変わります。
マクロの設計として、
- 「マクロブックを基準にしたい」 → ThisWorkbook
- 「ユーザーが今開いているブックを対象にしたい」 → ActiveWorkbook
という使い分けを意識すると、意図通りに動くコードになりやすいです。
Workbook を使うときに意識してほしい重要ポイント
「どのブックを触っているのか」を常に意識する
Workbook を意識せずにコードを書くと、
どのブックのどのシートを触っているのか分からない
アクティブブックが変わった瞬間に、別のファイルを壊してしまう
といった事故が起きやすくなります。
逆に、
Dim wb As Workbook
Set wb = Workbooks("売上集計.xlsx")
VBのように、最初に「対象のブック」を変数に握ってしまえば、
その後は wb.~ と書くだけで、常に同じブックを確実に触れます。
変数に入れてから使うと、読みやすさと安全性が一気に上がる
1行で全部書くこともできますが、
超初心者のうちは、あえて分解して書く方が理解が深まります。
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上集計.xlsx")
Set ws = wb.Worksheets("集計")
ws.Range("A1").Value = "OK"
VBこの書き方だと、
どのブックを触っているのか
どのシートを触っているのか
が一目で分かります。
「オブジェクトを変数に入れてから使う」という習慣は、
この先ずっと効いてくる大事なスキルです。
まとめ:Workbook は「ファイル1冊を丸ごと握るためのオブジェクト」
Workbook の本質は、
「Excel ファイル1冊を、プログラムから丸ごと扱うための“単位”」
です。
押さえておきたいポイントをコンパクトにまとめると、
Workbook = ファイル1個、Workbooks = 開いているブック全部
ThisWorkbook は「マクロが保存されているブック」、ActiveWorkbook は「今アクティブなブック」
Workbooks(“名前”) で特定のブックをつかまえ、変数に Set してから使うと安全
Workbook から Worksheets → Range と“上からたどる”書き方を身につけると、安定したコードになる
