ワークブックからのアドインの呼び出し方を考える。

まず、上の表のように、ワークブックを開いた時の立ち上げマクロ(ThisworkbookWorkbook_Open)でアドインを開いて初期処理を呼びます。
この時のアドインの「置き場」をどうするかが問題です。一番手っ取り早いのは、呼び出すワークブックと同じフォルダでしょう。このアドインを呼び出すワークブックがいくつあっても、このフォルダにはアドインは一つあれば良い(一つしか置けない)わけで、それぞれのワークブックにマクロを実装するのと比べてもリソース軽減であり、マクロに改廃があってもアドイン一つを上書きコピーすればどのワークブックも新しいアドインで動作することになります。


'***************************************************************************************************
'   アドインの動作テスト(ワークブックイベント記述)                  ThisWorkbook(Class)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   [参照設定]
'   ・Microsoft Scripting Runtime
'***************************************************************************************************
' 変更日付 Rev   変更履歴内容---------------------------------------------------------------------->
' 04/11/13(1.0.0)新規作成
' 19/06/16(1.1.0)*.xlam版アドイン用に再作成
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsADDIN = "ADDIN_TEST.xlam"                    ' アドインファイル名
Private Const g_cnsSETTEI = "設定"                              ' 設定シート名
Private Const g_cnsPASS = "password"                            ' PW
Private g_swCLOSE As Boolean                                    ' CLOSE判定

'***************************************************************************************************
'* 処理名 :Workbook_Open
'* 機能  :ワークブックOpen時イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年11月13日
'* 作成者 :井上 治
'* 更新日 :2019年06月16日
'* 更新者 :井上 治
'* 機能説明:アドインを開き、初期処理マクロを起動する
'* 注意事項:
'***************************************************************************************************
Private Sub Workbook_Open()
    '-----------------------------------------------------------------------------------------------
    Dim objFso As FileSystemObject                                  ' FileSystemObject
    Dim xlAPP As Application                                        ' Excel.Application
    Dim objWBK As Workbook                                          ' 本ブック
    Dim objSH_SETTEI As Worksheet                                   ' 設定シート
    Dim strFilename As String                                       ' ファイル名
    Set objFso = New FileSystemObject
    Set xlAPP = Application
    Set objWBK = ThisWorkbook
    Set objSH_SETTEI = objWBK.Worksheets(g_cnsSETTEI)
    ' アドインが開いたかの判定スイッチをクリア
    objSH_SETTEI.Cells(1, 1).Value = ""                         ' アドインファイル名  ' @
    objSH_SETTEI.Cells(2, 1).Value = ""                         ' ツールバー名
    '-----------------------------------------------------------------------------------------------
    strFilename = objFso.BuildPath(objWBK.Path, g_cnsADDIN)                           ' A
    ' アドインの存在確認(このサンプルではワークブックと同じフォルダ)
    ' ⇒多くのユーザーで共用する場合はそのアドインは共通フォルダに配置すべきです
    If Not objFso.FileExists(strFilename) Then
        ' 指定場所にアドインが存在しない
        ' ここでエラーにするか、そのままExitさせるかでアドインがない時の処置が違う
        ' 他の場所からアドインを開くという場合もある
        ' このサンプルでは設定シートのアドイン有無をクリアしているのでそのまま抜ける
        GoTo Open_AddinEXIT
    End If
    '-----------------------------------------------------------------------------------------------
    On Error GoTo Open_AddinError
    ' アドイン側の初期処理マクロの起動(引数は本ブック名)
    Call xlAPP.Run("'" & g_cnsADDIN & "'!InitialProc", objWBK.Name)                   ' D
    GoTo Open_AddinEXIT

'===================================================================================================
' アドインが開かれていない時の処理
Open_AddinError:
    ' アドインを開く
    xlAPP.Workbooks.Open Filename:=strFilename, ReadOnly:=True, Password:=g_cnsPASS   ' B
    On Error GoTo 0
    ' 自ブックをフォアに戻す
    objWBK.Activate                                                                   ' C
    Resume
'===================================================================================================
' 終了
Open_AddinEXIT:
    Set objFso = Nothing
End Sub
ソースコードはこんな感じです。この章の最後に、ツールバーを持つアドイン動作のサンプルを用意しております。
@
このサンプルでは、ワークブックと同じフォルダにアドインが存在しない場合は、「マクロを持たないただのワークブック」として振る舞うこととするので、「設定」シートのA1セルにアドインが開けたらアドインファイル名をセットします。
A
アドインのフルパスファイル名を編集して、FSOで存在するか確認します。存在しない場合は以降の処理は行ないません。存在しない場合の処置は処理によって異なります。
B
アドインを開きます。これは単純に普通のワークブックを開くのと同じ記述方法です。お勧めとしては、アドインの作成保存時に「読み取りパスワード」を設定しておくことです。「読み取りパスワード」を設定しておけば、間違ってアドインが単独で起動されることを避けられます。
他のワークブックから既に本アドインが開かれていると二重OPENでエラーとなるため、先にDでアドイン側のプロシージャを呼び出し、エラーの時はアドインが開かれていないものと判断してアドインを開くという動作にしています。
C
アドインと言っても、ワークブックの「IsAddin」プロパティをTrueにしていないと単なるワークブックと同じでワークシートが表示されてしまいます。原則は「IsAddin=True」ですが、一応、呼び元ワークブックをActiveに戻すように記述しておきます。
アドインが「IsAddin=True」になっていれば、ワークブックとは認識されません。この場合、ウィンドウも作成されず、開いたワークブックのカウント(Workbooks.Count)にも含まれません。
D
ここでアドイン側の「初期処理(InitialProc)」を呼びます。引数に自ブック名をセットすることでアドイン側に処理対象のブックを通知します。