Excel VBAでThisWorkbookとActiveWorkbookは何が違うのか

Excel VBA

Excel VBAでThisWorkbookとActiveWorkbookは何が違うのか

Excel VBAを書いていると、

ThisWorkbook

ActiveWorkbook

という書き方が出てきます。

どちらもExcelブックを指しているように見えますが、

意味はかなり違います。

この違いを理解しないまま使うと、

意図しない別ブックへ書き込んでしまうことがあります。

特に、

他人に配布するExcelマクロや、

業務用Excelツールでは注意が必要です。


結論:実務配布用ならThisWorkbookが無難

まず結論です。

ThisWorkbook は、

マクロが書かれているブック

を指します。

ActiveWorkbook は、

現在アクティブになっているブック

を指します。

自分だけが使う簡単なマクロなら、

ActiveWorkbook でも動くことはあります。

しかし、

実務配布用のExcelツールでは、

処理対象がブレにくい

ThisWorkbook

を基本にする方が安全です。


ThisWorkbookとActiveWorkbookの違い

書き方 指すもの 向いている場面 注意点 実務配布でのおすすめ度
ThisWorkbook マクロが書かれているブック ツール本体のシートを操作する場合 別ブックを処理したい場合には向かない
ActiveWorkbook 現在アクティブなブック ユーザーが前面にしているブックを処理したい場合 別ブックがアクティブだと誤操作しやすい

ポイントは、

どのブックを操作したいのか

です。

ツール本体の設定シートやログシートを操作したいなら、

ThisWorkbook が分かりやすいです。

一方で、

ユーザーが開いている別ブックを処理したい場合は、

ActiveWorkbook を使う場面もあります。


ThisWorkbookとは

ThisWorkbook は、

マクロが保存されているブックを指します。

例えば、

tool.xlsm

というマクロ付きブックにコードを書いている場合、

そのコード内の ThisWorkbook は、

基本的に tool.xlsm を指します。

そのため、

  • メニューシート
  • 設定シート
  • エラーログ
  • 入力用シート
  • 出力管理シート

など、

ツール本体の中にあるシートを操作するときに向いています。

配布用Excelツールでは、

処理対象がブレにくいのが大きな利点です。


ActiveWorkbookとは

ActiveWorkbook は、

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

つまり、

画面上で前面に出ているブックです。

ユーザーが別のExcelファイルをクリックして、

そちらがアクティブになっていれば、

ActiveWorkbook はその別ファイルを指します。

この性質は便利な場合もあります。

例えば、

ユーザーが開いた任意のブックを処理したい場合です。

ただし、

複数ブックを開いている実務環境では、

意図しないブックを操作する原因にもなります。


ActiveWorkbookで起きやすい事故

ActiveWorkbook を安易に使うと、

次のような事故が起きることがあります。

  • マクロ付きブックではなく、別のExcelファイルへ書き込んでしまう
  • 処理中に別ブックを開いて対象が変わる
  • ユーザーの操作状態に依存する
  • 自分のPCでは再現しない
  • 他人のPCでだけ事故る

特に危ないのは、

作った本人はいつも同じ手順で使っているため、

問題に気づきにくいことです。

しかし配布先では、

利用者がどのブックを開いているか分かりません。

そのため、

ActiveWorkbook に依存したコードは、

思わぬブック誤操作につながることがあります。


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

次のコードは、

ThisWorkbookActiveWorkbook の違いを確認するためのサンプルです。

このコードは、

標準モジュールに貼って、テスト用のxlsmで実行してください。

ご注意

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

Sub CheckWorkbookDifference()

    Range("A1").Value = "ThisWorkbook: " & ThisWorkbook.Name
    Range("A2").Value = "ActiveWorkbook: " & ActiveWorkbook.Name

    MsgBox "ThisWorkbook: " & ThisWorkbook.Name & vbCrLf & _
           "ActiveWorkbook: " & ActiveWorkbook.Name, vbInformation

End Sub

このコードを実行すると、

A1セルに ThisWorkbook の名前、

A2セルに ActiveWorkbook の名前が表示されます。

同じブックがアクティブな状態なら、

同じ名前になることがあります。

しかし、

複数のExcelブックを開き、

別ブックをアクティブにした状態で実行すると、

違いが分かりやすくなります。


実務配布ではThisWorkbookを基本にする理由

実務配布用のExcelツールでは、

利用者がどのようにExcelを開くか分かりません。

  • 他のExcelファイルを開いている
  • 複数ブックを並べて作業している
  • 作業中に別ファイルをクリックする
  • 途中で別ブックを開く
  • Excelの使い方が人によって違う

こうした状況では、

ActiveWorkbook に頼ると、

処理対象がブレる可能性があります。

一方で、

ThisWorkbook は、

マクロが入っているブックを指すため、

ツール本体内の処理では安定しやすいです。

メニューシート、

設定シート、

入力シート、

ログシートなどを操作するなら、

ThisWorkbook.Worksheets("シート名")

のように書く方が安全です。


ActiveWorkbookを使ってよい場面

ActiveWorkbook を完全に使ってはいけないわけではありません。

使ってよい場面もあります。

例えば、

  • ユーザーが開いた任意のブックを処理したい場合
  • ファイル選択後に、そのブックを処理対象として扱う場合
  • 一時的な確認用マクロ
  • 自分だけが使う簡単な作業マクロ

などです。

ただし、

その場合でも、

処理前に対象ブック名を確認するなど、

安全策を入れた方がよいです。

例えば、

「このブックを処理しますか?」

と確認するだけでも、

誤操作のリスクは下がります。


おすすめの書き方

実務用のVBAでは、

処理対象を最初に変数へ入れておくと分かりやすくなります。

例えば、

ツール本体を処理するなら、

次のように書きます。

Sub SampleUseThisWorkbook()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")

    ws.Range("A1").Value = "ThisWorkbookを基準に処理しています"

End Sub

このようにすると、

どのブック、

どのシートを操作しているのかが明確になります。

ActiveWorkbook をコード内で何度も直接書くより、

最初に対象ブックを決めて、

wbws のような変数で扱う方が安全です。


ActiveWorkbookを使うなら意図を明確にする

ActiveWorkbook を使う場合は、

「なぜActiveWorkbookなのか」

を明確にしておくことが重要です。

例えば、

ユーザーが選択したブックを処理したい場合は、

ファイル選択後にそのブックを変数へ入れます。

その上で、

以降の処理では変数を使います。

Sub SampleUseActiveWorkbookCarefully()

    Dim wb As Workbook

    Set wb = ActiveWorkbook

    MsgBox "処理対象ブック: " & wb.Name, vbInformation

End Sub

このように、

対象ブックを明示しておけば、

コードを読む人にも意図が伝わりやすくなります。

ただし、

配布用ツールで無条件に ActiveWorkbook を使うのは避けた方が無難です。


まとめ

ThisWorkbookActiveWorkbook は、

どちらもブックを扱うための書き方ですが、

意味は違います。

ThisWorkbook は、

マクロが入っているブック

です。

ActiveWorkbook は、

現在アクティブなブック

です。

実務配布用のExcelツールでは、

処理対象がブレにくい

ThisWorkbook

を基本にする方が安全です。

ActiveWorkbook を使う場合は、

ユーザーが開いた別ブックを処理したい場合など、

意図を明確にする必要があります。

迷ったら、

まず ThisWorkbook を使い、

必要に応じて対象ブックを変数で管理するのがおすすめです。


関連記事

  • Excelマクロボタンは図形・フォームコントロール・ActiveXのどれがいいのか
  • Excel VBAでフォームコントロールのボタンにマクロを登録する方法

維持DXノートについて

維持DXノートでは、

建設コンサル実務で使うExcel/VBAや、

橋梁点検調書作成支援ツールの開発メモを公開しています。

Excel作業の自動化や、

帳票作成の手間を減らす考え方を、

実務目線で整理しています。


関連する無料Excelツール

維持DXでは、

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

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

いずれも、

実務で発生しやすい

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

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

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

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

    お名前(任意)

    メールアドレス(必須)

    会社名・所属(任意)

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

    ご相談内容(任意)

    ご注意

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

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

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

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

    コメント