アドインが機能してはならない場合の処理。

アドインを呼び出したワークブックがアクティブでない、プロシージャが機能するシートが選択されていないなど、時点時点でプロシージャが機能して良い時と、良くない時があるわけですが、上の表の「1」〜「3」のような固定的な起動方法では、呼ばれたアドイン側のマクロの先頭で、表示されているワークブックやシートの状態を判断して動作可否を判断しなければなりません。

これにくらべ、「4」のツールバー方式なら、ワークブック側のウィンドウとシートの切り替えイベントでツールバーの状態を制御(EnabledVisible)するようにしておけば、マクロ自体の起動そのものを抑制できます。(この章の最後のツールバーを持つアドインのサンプルを参照して下さい。)

戻る 先頭に戻る

アドイン自身の撤去タイミング

「ツールバー」の撤去は、親となるワークブックが閉じられた時ですが、これには2つの条件があります。

「アドイン」自身を閉じるのは、他に同じアドインを参照しているワークブックがないことを確認する必要があります。
'*******************************************************************************
'   アドインの動作テスト(ワークブックイベント記述)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
Private Const cnsADDIN = "ADDIN_TEST.xla"   ' アドインファイル名
Private Const cnsSETTEI = "設定"            ' 設定シート名
Private Const g_cnsPASS = "password"
Private xlAPP As Application
Private objWBK As Workbook                  ' 本ブック
Private objSH_SETTEI As Worksheet           ' 設定シート
Private g_swCLOSE As Boolean                ' CLOSE判定

'*******************************************************************************
' ブックClose前イベント
'*******************************************************************************
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Const cnsTITLE = "終了処理"
    Dim objWBK2 As Workbook             ' WORK
    Dim swDEL As Byte                   ' アドイン削除スイッチ

    Set xlAPP = Application
    Set objWBK = ThisWorkbook                       ' 本ブック
    Set objSH_SETTEI = objWBK.Worksheets(cnsSETTEI) ' 設定
    ' アドインが開かれていない場合は処理なし
    If objSH_SETTEI.Cells(1, 1).Value <> cnsADDIN Then Exit Sub
    ' 非保存の確認
    If objWBK.ReadOnly <> True Then
        Select Case MsgBox("このブックは保存されていません。" & vbCr & _
            "保存して終了しますか?", vbYesNoCancel, cnsTITLE)            ' @
            Case vbYes
                xlAPP.StatusBar = False
                objWBK.Save                 ' 上書き保存                  ' A
            Case vbCancel
                Cancel = True               ' Closeをキャンセル           ' B
                Exit Sub
        End Select
    End If
    ' ツールバー削除の処理を呼ぶ(引数は本ブック名)
    xlAPP.Run "'" & cnsADDIN & "'!ToolBarDelete", objWBK.Name             ' C
    ' 開いている他ブックがアドインを使用しているか確認
    swDEL = 1
    For Each objWBK2 In xlAPP.Workbooks
        ' 本ブックではなく、同じシート数である
        If ((objWBK2.Name <> objWBK.Name) And _
            (objWBK2.Worksheets.Count = 3)) Then                          ' D
            ' 3番目のシート名が「設定」でA1セルにアドイン名が登録されている
            If ((objWBK2.Worksheets(3).Name = cnsSETTEI) And _
                (objWBK2.Worksheets(3).Cells(1, 1).Value = cnsADDIN)) Then
                swDEL = 0
                Exit For
            End If
        End If
    Next objWBK2
    ' 他ブックがアドインを使っていなければアドインCLOSE
    If swDEL = 1 Then
        On Error Resume Next
        xlAPP.Workbooks(cnsADDIN).Close False                             ' E
    End If
    xlAPP.StatusBar = False
    g_swCLOSE = True
    objWBK.Saved = True                     ' 保存済みにする
End Sub
これは、ワークブック側の「Workbook_BeforeClose」イベント記述のサンプルです。

この章の最後(次項)に、ツールバーを持つアドインのサンプルを用意しましたが、ソースコードは若干これよりまとめてあります。