ブックを開いたときにマクロを自動実行する方法を解説します。
ThisWorkbookモジュールのWorkbook_Openイベントを利用します。
基本構文
以下のコードをThisWorkbookモジュール内に記載します。
Private Sub Workbook_Open() ' ここに実行したいコードを記述 End Sub
実行したいマクロがすでに標準モジュールなどにある場合は、
Call ステートメントを使ってそのコードを呼び出します。
Private Sub Workbook_Open() Call 実行したいSubFunction名 End Sub
解説
ブックを開いたときにマクロを自動実行するには、
イベントプロシージャ「Workbook_Open」を利用します。
このプロシージャに引数はありませんので、
単純に上記のプロシージャをThisWorkbook内に書くだけで動きます。
このイベントはブックをマクロ(Workbooks.Open)で開いたときにも実行されます。
Openイベントを実行せずにブックを開きたい場合は、
Application.EnableEventsをFalseにしてから実行してください。
' テストファイルのWorkbook_Openイベントを実行せずに開く Application.EnableEvents = False Workbooks.Open "C:\Users\~~\テストファイル.xlsm" Application.EnableEvents = True
実行が「マクロを有効化」したタイミングになる問題
このイベントプロシージャ最大の問題は、
実際は開いた時ではなく「マクロを有効化」したときに実行される問題です。

この問題を根本的に解決する方法はありませんので、
どうしてもマクロ実行前にブックをいじってほしくない場合は、
以下いずれかのような仕組みを作る必要があります。
必ずWorkbook.Openで開く
対象のブックを手作業で開けないよう隠しフォルダなどに入れ、
実行用のマクロブックなどからWorkbook.Openで必ず開く運用にします。
これならイベントは必ず実行されることになりますが、当然のデメリットとして、
ユーザーがエクスプローラーからファイルを選んで開くことはできません。
この運用ができる場合限定の対策と思ってください。
Workbook_Openで解除するまでシートをロックする
Private Sub Workbook_Open() ' ここにブックを開いた直後に実行したいコードを記述 ' その処理が終わった最後にシートの保護を解除 Call ブック内のすべてのシートの保護を解除する(Thisworkbook) End Sub Sub ブック内のすべてのシートの保護を一括で解除する(対象ブック As Workbook) Dim シート As Worksheet For Each シート In 対象ブック.Worksheets シート.Unprotect Next End Sub
対象ブックのすべてのシートを保護しておき、
Workbook_Openですべての保護を解除する仕様にしておきます。
こうすることでマクロを有効化するまで編集できないブックを作れます。
この方法を採用する場合は当然「ロックしてから保存」する必要があるため、
BeforeSaveイベントを使って「保存時は必ずロック」という状態を作ります。
しかもこれだけだと「保存後にまた編集したい」という状態が作れないため、
AfterSaveイベントを使って「保存後に再度解除」しなければいけません。
かなり手間がかかる機能ですが、
上記のように関数化しておくとまだましになりますね。
この関数の中身についてはこちらの記事を参照ください。
[準備中]
Workbook_Openで再表示するまで全シートを非表示にしておく
前述のシートの保護と同じように「シートの表示/非表示」機能を使って、
マクロのロックを解除しないとシートが見れないように設計できます。
こちらもBeforeSave/AfterSaveイベントを使って、
保存時に表示/非表示をコントロールする必要があります。
ブック自体を非表示にしておく
非表示のマクロブックを開いた際、前述の黄色い帯が出せないためか、

このダイアログが表示される形になります。
これなら「有効にする」を選んだ時にブックも開かれるため、
そのタイミングでWorkbook_Openイベント内でブックを再表示することで、
ブックの表示自体をマクロを有効化したときに限定できますね。
例によってこの方法も、
保存の前後で表示/非表示を切り替える必要があります。
シートの保護/非表示を使用したときと同様に、
BeforeSave/AfterSaveイベントを使って保存状態をコントロールしてください。
以上、私が思いつく範囲ではこれらの方法をとる必要があります。
「マクロを有効化」を押す前にWorkbook_Openを実行することはできませんので、
これらの方法を使って運用や仕様でカバーしてください。