Excel VBAでコードを書き始めると、多くの人がThisWorkbook
とActiveWorkbook
という2つのキーワードに遭遇します。これらはどちらもブックを指しているように見えますが、その意味は全く異なり、この違いを理解していないと、意図しないブックを操作してしまい、マクロがエラーを起こす原因になります。
この記事では、VBAプログラミングの基本でありながら非常に重要な、ThisWorkbook
とActiveWorkbook
の決定的な違いと、どちらをいつ使うべきかという指針を明確に解説します。
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
のように変数に格納し、処理の途中で対象が変わらないように固定する工夫が推奨されます。
まとめ
ThisWorkbook
とActiveWorkbook
の違いを、一言でまとめると以下のようになります。
キーワード | 指す対象 | 特徴 |
ThisWorkbook | コードが記述されているブック | 不変・安定的。 ユーザー操作の影響を受けない。 |
ActiveWorkbook | 現在アクティブなブック | 可変・動的。 ユーザー操作によって対象が切り替わる。 |
Google スプレッドシートにエクスポート
VBAで安定したマクロを作成するための鉄則は、「可能な限りThisWorkbook
を基準に考え、ActiveWorkbook
の使用は意図的な場合に限定する」ということです。この使い分けをマスターすることが、脱初心者への大きな一歩となります。