【Excel VBA】ThisWorkbookとActiveWorkbookの決定的な違いと正しい使い分け

Excel VBAでコードを書き始めると、多くの人がThisWorkbookActiveWorkbookという2つのキーワードに遭遇します。これらはどちらもブックを指しているように見えますが、その意味は全く異なり、この違いを理解していないと、意図しないブックを操作してしまい、マクロがエラーを起こす原因になります。

この記事では、VBAプログラミングの基本でありながら非常に重要な、ThisWorkbookActiveWorkbookの決定的な違いと、どちらをいつ使うべきかという指針を明確に解説します。


目次

ThisWorkbook とは? – コードが書かれているブック

ThisWorkbookは、そのVBAコードが記述・保存されているExcelファイルそのものを、常に指し示します。

これは不変の参照であり、ユーザーが他のExcelファイルを開いたり、アクティブなウィンドウを切り替えたりしても、ThisWorkbookが指すブックは決して変わりません。

✓ アナロジー: ThisWorkbookはあなたの「自宅」のようなものです。どこに出かけて何を見ていても、あなたの「自宅」の場所は変わりません。

コード例

このコードは、どのブックがアクティブな状態であっても、必ず「このマクロが保存されているブック」のSheet1のセルA1を操作します。

Sub ManipulateThisWorkbook()
    ' このマクロが保存されているブックの「Sheet1」のセルA1に値を書き込みます
    ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "This is the Macro book."
    
    ' どのブックがアクティブでも、常にこのマクロのブックが操作されます
    MsgBox "「" & ThisWorkbook.Name & "」のセルを操作しました。"
End Sub

ActiveWorkbook とは? – 現在アクティブなブック

ActiveWorkbookは、その時点でExcelの画面上で一番手前に表示されている、現在アクティブなブックを指します。

これは可変の参照であり、ユーザーがクリックして別のブックのウィンドウをアクティブにすれば、ActiveWorkbookが指す対象もその瞬間に切り替わります。

✓ アナロジー: ActiveWorkbookは「今あなたが見ている景色」のようなものです。顔を向ける方向を変えれば、「見ている景色」も変わります。

コード例

このマクロを実行する前に、複数のExcelブックを開いておき、クリックしてアクティブなブックを切り替えてから試すと、結果が変わることが分かります。

Sub ShowActiveWorkbookName()
    ' 現在一番手前に表示されているブックの名前を表示します
    ' 実行する前に、別のブックをクリックしてアクティブにしてみてください
    If ActiveWorkbook Is Nothing Then
        MsgBox "アクティブなブックがありません。"
    Else
        MsgBox "現在アクティブなブックは「" & ActiveWorkbook.Name & "」です。"
    End If
End Sub

正しい使い分けと注意点

この2つのキーワードの使い分けは、マクロの安定性を左右する非常に重要なポイントです。

ThisWorkbook を使うべき時:

  • マクロが保存されているブック内のシート(例: 設定シート、データマスタ、ログシート)を読み書きする時。
  • ユーザーの操作に影響されずに、常に特定のブックを基準として操作したい時。
  • 結論: 自ブック内の操作が基本。迷ったらこちらを使うのが安全。

ActiveWorkbook を使うべき時:

  • 開いている任意のファイルに対して処理を行う、汎用的なツール(アドインなど)を作成する時。
  • マクロの目的が「ユーザーが今開いているファイルに対して何かをすること」であると明確な場合。
  • 結論: ユーザーがアクティブにしているブックを意図的に操作したい場合に限定して使う。 ただし、マクロの冒頭でSet myBook = ActiveWorkbookのように変数に格納し、処理の途中で対象が変わらないように固定する工夫が推奨されます。

まとめ

ThisWorkbookActiveWorkbookの違いを、一言でまとめると以下のようになります。

キーワード指す対象特徴
ThisWorkbookコードが記述されているブック不変・安定的。 ユーザー操作の影響を受けない。
ActiveWorkbook現在アクティブなブック可変・動的。 ユーザー操作によって対象が切り替わる。

Google スプレッドシートにエクスポート

VBAで安定したマクロを作成するための鉄則は、「可能な限りThisWorkbookを基準に考え、ActiveWorkbookの使用は意図的な場合に限定する」ということです。この使い分けをマスターすることが、脱初心者への大きな一歩となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次