Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Workbook

Excel VBA VBA
スポンサーリンク

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つ返す」
  • それを Setwb に入れている

という流れです。

「このファイル名のブックに対して処理したい」というときの基本形になります。


新しいブックを作る・既存ブックを開く・保存する・閉じる

新しいブックを作る(Add)

Sub SampleWorkbookAdd()

    Dim wb As Workbook

    Set wb = Workbooks.Add   ' 新しいブックを1冊作る

    wb.Worksheets(1).Range("A1").Value = "新規ブックです"

End Sub
VB

Workbooks.Add の戻り値が「作られたばかりの Workbook」なので、
それを wb に受け取ってから操作すると分かりやすくなります。

既存ファイルを開く(Open)

Sub SampleWorkbookOpen()

    Dim wb As Workbook

    Set wb = Workbooks.Open("C:\Data\売上集計.xlsx")

    MsgBox "開いたブックは " & wb.Name & " です。"

End Sub
VB

Workbooks.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
VB

ThisWorkbook は、「この VBA コードが保存されているブック」です。
マクロ用の管理ブックから、別のデータブックを操作するようなときに、
「自分自身(マクロブック)」を指すのに使います。

ActiveWorkbook:今ユーザーが触っているブック

Set wb = ActiveWorkbook
VB

ActiveWorkbook は、「今アクティブなブック」です。
ユーザーがどのブックを選んでいるかによって変わります。

マクロの設計として、

  • 「マクロブックを基準にしたい」 → 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 と“上からたどる”書き方を身につけると、安定したコードになる

VBAVBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました