
Excelマクロ開発を量産してゆくと、「どのツールは誰が担当して、どんな概要で・・・」
このようなことが起きるのは望ましくありませんので、基本情報や、伝達事項、備忘メモを残しましょう。
みなさん、こんにちは。セルネッツ竹本です。
今回は、Thisworkbookの活用提案をしたいと思います。
結論から言うと、ThisWorkbookとは「そのマクロを書いたブック自身」のことです。
VBAの画面にあるThisWorkbookモジュールには、ブックを開いたときの処理や、ツールの基本情報を書くのがおすすめです。
この記事では、次の内容がわかります。
- ThisWorkbookの意味と、ActiveWorkbookとの違い
- ThisWorkbookモジュールの場所と、標準モジュールとの使い分け
- プロがThisWorkbookに書いている内容(基本情報のメモと起動時の処理)
属人化したマクロの引き継ぎ
誰が作ったか分からないExcelマクロ、増え続けていませんか?
- 部署内にツールが量産され、担当者も目的も分からなくなった
- 作った人の異動・退職で、不具合が出ても誰も直せない
- 起動するたびに手作業の準備が必要で、使い方が人によって違う
そのお悩み、既存マクロの解析と引き継ぎで解決できます。Excel専門のシステム開発会社『セルネッツ』なら、前任者が作ったマクロを読み解き、改修・整理できます。起動時の準備処理の自動化や、概要・作成者などの情報整備にも対応します。使い続けられるツールへと立て直します。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料
ThisWorkbookとは?「マクロを書いたブック自身」を指す
ThisWorkbookとは、いま実行しているマクロのコードが書かれているブックのことです。
VBAでは、次の2つの意味で使われます。
- オブジェクトとしてのThisWorkbook:コードの中で「このブック」を指す書き方(例:ThisWorkbook.Path)
- ThisWorkbookモジュール:ブックを開く・閉じるといった、ブック全体の出来事に合わせた処理を書く場所
仕様の詳細は、Microsoft Learn「Application.ThisWorkbook プロパティ」で確認できます。
ThisWorkbookとActiveWorkbookの違い
ThisWorkbookは常に「コードを書いたブック」、ActiveWorkbookは「いま前面に出ているブック」を指します。
| 比べる点 | ThisWorkbook | ActiveWorkbook |
| 指すブック | マクロのコードが書かれているブック | いまアクティブ(前面)のブック |
| 操作による変化 | 変わらない | 別のブックを開くと変わる |
| アドインから使うと | アドインのブック自身 | アドインを呼び出したブック |
| 向いている場面 | ツール自身のシートや保存先を扱う | ユーザーが開いているブックを加工する |
別のブックを開いて処理するマクロで、ツール自身のシートをActiveWorkbookで指定すると、開いた側のブックを書き換えてしまうことがあります。
ツール自身を指すときはThisWorkbookと書くのが安全です。
アドインでの使い方は、Excelアドインの活用例とファイルの格納先で紹介しています。
ThisWorkbookモジュールはどこにある?開き方
ThisWorkbookモジュールは、VBAの編集画面(VBE)のプロジェクトエクスプローラーにあります。
- Excelで Alt + F11 キーを押して、VBEを開く
- 左側のプロジェクトエクスプローラーで「VBAProject(ブック名)」→「Microsoft Excel Objects」を開く
- 「ThisWorkbook」をダブルクリックする
プロジェクトエクスプローラーが表示されていないときは、VBEのメニューの「表示」から表示できます。
ThisWorkbookモジュールは、どのブックにも最初から1つだけあり、削除できません。
ThisWorkbookモジュールと標準モジュールの違い
ブック全体の出来事(イベント)に合わせた処理はThisWorkbook、それ以外の処理は標準モジュールに書くのが基本です。
| モジュール | 書く内容 | 例 |
| ThisWorkbookモジュール | ブックのイベントで動く処理 | 開いたとき(Workbook_Open)、閉じる前(Workbook_BeforeClose)、保存する前(Workbook_BeforeSave) |
| 標準モジュール | ボタンなどから呼び出す、通常の処理 | 集計、転記、ファイルの取り込み |
ThisWorkbookに処理をすべて書き込むと、どこに何があるか分かりにくくなります。
ThisWorkbookには「きっかけ」だけを書き、中身の処理は標準モジュールから呼び出す形にすると整理しやすくなります。
プロはThisWorkbookに何を書いている?①基本情報・改修履歴のメモ
プログラム開発という作業は、システムが納品され他の開発プロジェクトが進行すると、仕様や概要は徐々に忘れ去ってゆくもの。
進行中の案件に集中してゆくことになるので、自身で作ったプログラムも時間が経過すれば、「何でこんなことしたんだっけ?」といった記憶をたどるシーンに必ず遭遇するもの。
概要をはじめ、作成者、更新者など、基本情報を簡潔に記載しておくと振り返りにもなります。
たとえば、ThisWorkbookモジュールの先頭に、次のようなコメントを書いておきます。
‘==============================================
‘ ツール名 : 売上集計ツール
‘ 概要 : 各支店のCSVを取り込み、月次の売上表を作成する
‘ 作成者 : 〇〇(作成日 yyyy/mm/dd)
‘ 更新履歴 : yyyy/mm/dd △△ 取り込む支店を追加
‘==============================================
Thisworkbookモジュールは、必ず存在するのと、目に付く場所にあるので、ここに集約したまでですが、システム開発では、改修の履歴も管理する必要があるため、備忘メモを書くエリアとして活用することもできます。
改修依頼をいただいた際に、仕様を思い出しながらの作業をしないためにも、是非。
②Workbook_Open()に起動時の処理を書く
ツール起動時にやっておくべきことがあれば、このModuleに処理を書きます。
Workbook_Openは、ブックを開いたときに自動で実行されるイベントです。
ThisWorkbookモジュールを開き、コードウィンドウ上部の左のリストで「Workbook」を選ぶと、Workbook_Openの枠が自動で入ります。
以下のO_00は、シートに付けたオブジェクト名です(シート名ではありません)。
(1つ目)
Application.ScreenUpdating = False
解説:画面の更新を無効にする
起動時の処理の間、画面のちらつきを抑えて速く動かすためです。処理の最後にTrueに戻します。
(2つ目)
‘[シート保護]でもVBAから書込み可能に
O_00.Protect UserInterfaceOnly:=True
解説:シート保護On/Off繰り返しは避ける
画面からの変更は保護したまま、マクロからの書き込みだけを許可します。
この設定はブックを開き直すと保たれないため、開くたびにWorkbook_Openで設定し直すのが定番です(Microsoft Learn「Worksheet.Protect メソッド」)。
(3つ目)
‘[ホームポジション]
Application.Goto O_00.Range(“A1”), True
解説:ユーザビリティの基本、カーソル位置はホームへ
3つをまとめると、ThisWorkbookモジュールには次のように書きます。
Private Sub Workbook_Open()
Application.ScreenUpdating = False
O_00.Protect UserInterfaceOnly:=True
Application.Goto O_00.Range(“A1”), True
Application.ScreenUpdating = True
End Sub
シートをオブジェクト名で指定すると、シート名が変わってもコードが動きます。
詳しくは、ワークシートをID管理して可読性を上げる方法をご覧ください。
起動時の自動処理の例
たとえば、「下準備」と考えると意外に出てくるもの。
- 前提条件の判定チェック(必要な関連ファイルの存在チェック)
- 外部ファイルからのデータ取り込み
- ツール起動したため、ログを書き込み
- 関連ファイル自動バックアップ(リカバリ考慮)
- 利用権限(管理者/一般)の判定チェック
他にも、ツール内のシートのクリアや入力チェックをすることも多いです。
シートを毎回同じ状態から始める考え方は、リセット処理でバグの発生率を下げる方法で解説しています。
よく使うThisWorkbookのプロパティ・メソッド
オブジェクトとしてのThisWorkbookは、ツール自身の保存先やファイル名を取るときによく使います。
| 書き方 | 得られるもの・動き |
| ThisWorkbook.Path | ブックが保存されているフォルダのパス(末尾に\は付かない) |
| ThisWorkbook.Name | ブックのファイル名 |
| ThisWorkbook.FullName | フォルダのパスとファイル名をつなげたもの |
| ThisWorkbook.Worksheets(“設定”) | ツール自身の「設定」シート |
| ThisWorkbook.Save | ツール自身を上書き保存する |
たとえば、ツールと同じフォルダにあるCSVを開くときは、次のように書きます。
Workbooks.Open ThisWorkbook.Path & “\data.csv” ‘ツールと同じフォルダのCSVを開く
OneDrive上のブックでは、ThisWorkbook.Pathが「https://」で始まるURLになることがあります。
対策は、OneDrive上で取得したパスがhttpに変わってしまう対策で紹介しています。
ThisWorkbookを使うときの注意点
- マクロが無効だとWorkbook_Openは動かない:起動時の処理に頼りすぎず、必要ならボタンからも実行できるようにしておく
- 保存していないブックはPathが空になる:新規ブックでThisWorkbook.Pathを使うと、パスが取れない
- 起動時の処理を重くしすぎない:開くたびに待たされると、使う人の負担になる
- ActiveWorkbookと取り違えない:別のブックを開く処理では、どちらのブックを指しているかを必ず確認する
よくある質問
Q. ThisWorkbookとActiveWorkbookは、どちらを使えばよいですか?
A. ツール自身のシートや保存先を扱うならThisWorkbookです。
ユーザーが開いている別のブックを加工するときだけ、ActiveWorkbookや、開いたブックを入れた変数を使います。
Q. マクロはThisWorkbookに書けばよいのですか?
A. 通常の処理は標準モジュールに書きます。
ThisWorkbookには、ブックを開いたとき・閉じる前など、ブックのイベントで動かす処理を書きます。
Q. Workbook_Openが動かないのはなぜですか?
A. よくある原因は、マクロが無効になっていることと、標準モジュールなどThisWorkbook以外に書いていることです。
Workbook_OpenはThisWorkbookモジュールに書く必要があります。
まとめ
- ThisWorkbookは「マクロを書いたブック自身」を指し、操作しても変わらない
- ActiveWorkbookは「いま前面にあるブック」で、別のブックを開くと変わる
- ThisWorkbookモジュールには、ツールの基本情報・改修履歴のメモと、Workbook_Openの起動時処理を書く
保守しやすいマクロの作り方は、コード設計のコツを覚えて設計力をスキルアップする方法でも紹介しています。
本記事が、品質向上において、ご参考お役立てになれば幸いです。
相見積もり歓迎
引き継ぎ・改修の費用は、ツールを拝見してお見積もりします
- 基本料金50,000円+要件定義・設計・開発の時間単価(税別)
- 新たに作り直す場合、簡易システムは30万円〜(税別)です
- 使われていないツールは、無理に改修をおすすめしません
セルネッツでは相見積もりを歓迎しています。改修で済むか、作り直した方がよいかも、正直にご説明します。Excelで続けるのが不向きな業務なら、その旨もお伝えします。システム導入相談やセカンド・オピニオンも、60分無料で承ります。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料