Excel VBAで別ブックを操作するときのThisWorkbook・ActiveWorkbook・Workbooksの違い

Excel VBA

Excel VBAで別ブックを操作するときのThisWorkbook・ActiveWorkbook・Workbooksの違い

Excel VBAで別ブックを操作しようとすると、似たような言葉がいくつも出てきます。

代表的なのが、

  • ThisWorkbook
  • ActiveWorkbook
  • Workbooks

です。

どれもブックに関係する書き方ですが、意味は違います。

ここを何となく使っていると、意図しないブックに書き込んだり、違うファイルを保存してしまったりする事故につながります。

特に、業務用Excelや配布用マクロでは、複数のブックを同時に開くことが多いため注意が必要です。

この記事では、Excel VBAで別ブックを操作するときの ThisWorkbookActiveWorkbookWorkbooks の違いと使い分けを、実務目線で整理します。


別ブック操作で迷うThisWorkbook・ActiveWorkbook・Workbooks

Excel VBAで別ブックを操作するとき、次のような場面があります。

  • マクロが入っているブックの設定シートを読む
  • ユーザーが開いているブックを処理する
  • テンプレートブックを開いて出力する
  • 入力用ブックからデータを読む
  • 出力用ブックへ値を書き込む
  • 複数のExcelファイルを順番に処理する

このときに、ThisWorkbookActiveWorkbookWorkbooks を曖昧に使うと危険です。

名前が似ているので混乱しやすいですが、指しているものは違います。

ざっくり言うと、

  • ThisWorkbook:VBAコードが入っているブック
  • ActiveWorkbook:いま前面にあるブック
  • Workbooks:開いているブック全体の集合

です。

この違いを理解しておくと、別ブック操作の事故を減らしやすくなります。


結論:実務配布では対象ブックを明示する

結論から言うと、実務配布用Excelでは、対象ブックを明示する書き方が無難です。

使い分けの基本は次のとおりです。

  • ツールブックを操作するなら ThisWorkbook
  • いま前面のブックを対象にするなら ActiveWorkbook
  • 開いているブック群を扱うなら Workbooks
  • 外部ブックを開くなら Workbook 変数に入れて操作する

特に注意したいのは ActiveWorkbook です。

ActiveWorkbook は、マクロが入っているブックではありません。

現在アクティブになっているブックを指します。

つまり、ユーザーが別のブックをクリックしたり、処理中に別ブックが前面に来たりすると、対象が変わる可能性があります。

業務用マクロでは、処理対象が曖昧なコードは事故の入口になります。

そのため、配布用Excelでは ActiveWorkbook 依存を減らし、ThisWorkbookWorkbook 変数で対象を明示する方が安全です。


ThisWorkbookとは

ThisWorkbook は、そのVBAコードが入っているブックを指します。

たとえば、マクロ付きブック tool.xlsm の中にVBAコードが書かれている場合、そのコード内の ThisWorkbooktool.xlsm を指します。

ユーザーが別のExcelブックを前面にしていても、ThisWorkbook は変わりません。

そのため、マクロ付きツール本体の中にある、

  • 設定シート
  • マスタシート
  • メニューシート
  • ログシート
  • 内部処理用シート

を参照するときに向いています。

例えば、ツールブック内の「設定」シートを見るなら、次のように書けます。

ThisWorkbook.Worksheets("設定").Range("A1").Value

これは、「このVBAコードが入っているブックの、設定シートのA1」という意味になります。

業務用ツールでは、この明示性が大事です。

ただし、ThisWorkbook はあくまでコードが入っているブックです。

ユーザーが開いている別ブックを操作したい場合には向きません。


ActiveWorkbookとは

ActiveWorkbook は、現在アクティブになっているブックを指します。

分かりやすく言うと、画面上でいま前面にあるブックです。

例えば、

  • tool.xlsm:マクロが入っているブック
  • input.xlsx:ユーザーが開いている入力ブック
  • output.xlsx:出力用のブック

を同時に開いているとします。

このとき、ユーザーが input.xlsx をクリックして前面に出していれば、ActiveWorkbookinput.xlsx です。

tool.xlsm ではありません。

つまり、ActiveWorkbook は、マクロが入っているブックとは限りません。

ここを勘違いすると、意図しないブックを操作する事故が起きます。

たとえば、

ActiveWorkbook.Worksheets(1).Range("A1").Value = "確認"

と書くと、現在アクティブなブックの1枚目のシートに値を書き込みます。

どのブックに書き込むかは、その瞬間に前面にあるブック次第です。

自分用の一時的な作業補助なら便利な場面もあります。

しかし、他人に配布するExcelや業務用マクロでは、注意が必要です。


Workbooksとは

Workbooks は、Excelで開いているブック全体の集合を表します。

現在開いているブックをまとめて扱うためのものです。

たとえば、開いているブック名を指定して操作する場合、次のように書けます。

Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Value

これは、「開いているBook1.xlsxのSheet1のA1」という意味です。

また、外部ブックを開くときにも Workbooks.Open を使います。

Workbooks.Open "ファイルパス"

ただし、実務では Workbooks.Open の直後に ActiveWorkbook に頼るより、開いたブックを Workbook 変数に入れる方が安全です。

また、Workbooks("Book1.xlsx") のように名前で指定する場合は、ブックが開いていなければエラーになります。

同名ブックやファイル名変更にも注意が必要です。


Workbooks.Openしたブックは変数で受ける

外部ブックを開いて処理する場合は、Workbooks.Open の戻り値を Workbook 変数で受けるのが安全寄りです。

考え方としては、次のような形です。

Dim targetWb As Workbook
Set targetWb = Workbooks.Open("ファイルパス")

こうしておけば、その後は targetWb を使って操作できます。

たとえば、

targetWb.Worksheets("Sheet1").Range("A1").Value

のように書けば、「targetWbのSheet1のA1」を操作していることがコード上で分かります。

さらに、シートも変数に入れると読みやすくなります。

Dim targetWs As Worksheet
Set targetWs = targetWb.Worksheets("Sheet1")

このように、

  • targetWb:処理対象ブック
  • templateWb:テンプレートブック
  • sourceWb:入力ブック
  • outputWb:出力ブック

のような変数名にしておくと、どのブックを操作しているかが分かりやすくなります。

業務用マクロでは、コードを書いた本人以外が見ても処理対象を追えることが重要です。


3つの違いを表で整理する

書き方 指すもの 向いている場面 注意点
ThisWorkbook VBAコードが入っているブック ツール本体の設定・マスタ・ログを操作する ユーザーが開いた別ブックを操作する用途には向かない
ActiveWorkbook 現在アクティブなブック いま前面のブックを対象にする一時処理 マクロ入りブックとは限らず、対象が変わる
Workbooks 開いているブック全体の集合 名前指定、外部ブックを開く、複数ブック管理 名前違い、未オープン、同名ブックに注意

この3つは、どれが上位互換という話ではありません。

それぞれ役割が違います。

ただし、業務用・配布用Excelでは、ActiveWorkbook に頼りすぎない方が安全です。

処理対象が決まっているなら、ブックを明示する設計にした方が事故を減らせます。


危ない書き方と安全寄りの書き方

別ブック操作で危ないのは、対象ブックが曖昧な書き方です。

例えば、次のようなコードです。

ActiveWorkbook.Sheets(1).Range("A1").Value = "確認"

このコードは、現在アクティブなブックの1枚目のシートに値を書き込みます。

しかし、複数ブックを開いている場合、どのブックがアクティブかはその瞬間次第です。

前面ブックが変われば、処理対象も変わります。

ツールブック内のシートを操作したいなら、次のように書いた方が安全です。

ThisWorkbook.Worksheets("設定").Range("A1").Value = "確認"

外部ブックを操作したいなら、Workbook変数で対象を固定します。

Dim targetWb As Workbook
Dim targetWs As Worksheet

Set targetWb = Workbooks("対象ブック.xlsx")
Set targetWs = targetWb.Worksheets("Sheet1")

targetWs.Range("A1").Value = "確認"

このように書くと、「どのブックの、どのシートを操作しているか」が読みやすくなります。

実務では、この読みやすさが事故防止につながります。


コピペで試せる確認用VBAコード

以下は、ThisWorkbookActiveWorkbookWorkbooks の違いを確認するための短いコードです。

複数ブックを開いた状態で実行すると、違いを確認しやすくなります。

ご注意

以下のVBAコードは、動作イメージを確認するためのサンプルです。
実行前に必ずExcelファイルのバックアップを作成してください。
業務で使用しているファイルに、いきなり貼り付けて実行しないでください。
Excelのバージョンや設定により、動作が異なる場合があります。

Public Sub CheckWorkbookObjects()

    MsgBox "ThisWorkbook: " & ThisWorkbook.Name & vbCrLf & _
           "ActiveWorkbook: " & ActiveWorkbook.Name & vbCrLf & _
           "開いているブック数: " & Workbooks.Count, vbInformation

End Sub

このコードでは、

  • ThisWorkbook のブック名
  • ActiveWorkbook のブック名
  • 開いているブック数

を表示します。

ファイル保存、削除、外部通信は行いません。

複数のExcelブックを開いた状態で、別のブックを前面にしてから実行すると、ThisWorkbookActiveWorkbook が違うことを確認できる場合があります。

この違いを体感しておくと、別ブック操作の事故を減らしやすくなります。


維持DX的にはどう考えるか

維持DX的には、実務配布用Excelでは対象ブックを明示することが重要だと考えています。

建設コンサル実務では、複数のExcelブックを同時に開くことがよくあります。

例えば、

  • 調書
  • 一覧表
  • テンプレート
  • マスタ
  • チェック表
  • 過年度成果
  • 修正後ファイル

などです。

この状態で ActiveWorkbook に頼ると、意図しないブックを操作する可能性があります。

特に、他人に配布するExcelでは、利用者がどのブックを前面にしているかを完全には管理できません。

だからこそ、

  • ツール本体は ThisWorkbook
  • 外部ファイルは Workbook 変数
  • シートは Worksheet 変数
  • 処理対象はログや表示で確認できるようにする

という設計が安全寄りです。

維持DXのツール設計でも、対象ファイルの明示、ログ記録、人間確認を重視しています。

マクロが勝手に賢く判断するより、何を処理したか後から確認できることが大事です。


関連して読みたい記事

Workbook系の書き方で迷う場合は、次の記事も関連します。

  • Excel VBAでThisWorkbookとActiveWorkbookは何が違うのか
  • Excel VBAでActiveWorkbookを使うと事故る理由
  • Excel VBAでSelectを使ってはいけないと言われる理由
  • Excel VBAでWorkbooks.Openしたブックを安全に操作する方法

ActiveWorkbookSelectActivate に頼るほど、処理対象が画面状態に左右されやすくなります。

別ブック操作では、対象をコード上で明示することが重要です。


まとめ

ThisWorkbook は、VBAコードが入っているブックを指します。

ActiveWorkbook は、いまアクティブなブックを指します。

Workbooks は、開いているブック全体の集合を指します。

ツール内処理では、ThisWorkbook が安全です。

外部ブックを操作するなら、Workbooks.Open の戻り値を Workbook 変数で受け、対象ブックを固定する方が安全です。

実務配布では、対象ブックを明示する書き方を優先しましょう。

複数ブックを開く実務では、「いま前面にあるブック」に頼るほど事故りやすくなります。


維持DXノートについて

維持DXノートでは、建設コンサル実務や土木実務で使うExcel/VBAツール、Word・Excel帳票の整理を支援する小さなツールの開発メモを公開しています。

無料で使えるExcelツールも公開していますので、業務用Excelツールや帳票作成の効率化に関心がある方は、あわせてご覧ください。


関連する無料Excelツール

維持DXでは、

橋梁点検・維持管理業務向けのExcel VBAツールを無料公開しています。

  • 橋梁点検調書の作成支援ツール
  • 評価結果一覧作成ツール
  • 旧様式から2024様式への移行支援ツール
  • 成果整合確認ツール

いずれも、

実務で発生しやすい

  • 転記作業
  • 写真貼付
  • 一覧作成
  • 旧成果移行
  • 整合確認

の負担を減らすための補助ツールです。

以下のフォームにメールアドレスを入力すると、

ダウンロードURLを自動返信メールでお送りします。

    お名前(任意)

    メールアドレス(必須)

    会社名・所属(任意)

    ご関心のある内容(任意)

    ご相談内容(任意)

    ご注意

    ダウンロードURLは、入力いただいたメールアドレス宛に自動返信で送信されます。

    ダウンロードしたExcelでマクロが実行できない場合は、

    右クリック → プロパティ →「許可する」 をチェック後、再度開いてください。

    (Windowsのセキュリティ機能により初回実行時にブロックされる場合があります)

    コメント