アドインの場合、メニューへの追加だけでなく、
メニューからの削除まできっちり行わなければならない。

Workbook (ThisWorkbook) にはアドイン用のイベントがある。AddinInstall と AddinUninstall だ。

アドインが Excel で使用可能になった時点で、
AddinInstall イベントが発生し、アドインを削除した際に、
AddinUninstall イベントが発生する。
Install/Uninstall という名前が示すとおり、
アドインの導入時と導入解除時しか発生しない。

一度チェックされたアドインは、Excel 起動時に、
Excel がそのアドインをロードするため、
Install イベントは発生しない。

以上を考えると、各イベントの処理は以下のとおりとなる。

・AddinInstall
  アドイン用メニューの追加
・AddinUninstall
  アドイン用メニューの削除
・Open
  メニューのイベントハンドラの接続

Open イベントは、普通にブックとして開く場合でも、
アドインとして開く場合でも発生するので厄介だが、
AddinInstall と Open で行う処理は、
同じ処理としてまとめてしまえばいいのだ。

    ' アドイン/ワークブックが開かれた
    Private Sub Workbook_Open()
        On Error Resume Next
        Call RegisterMenuItem
    End Sub

    ' アドインの導入(直後に Open が発生)
    Private Sub Workbook_AddinInstall()
        On Error Resume Next
        Call RegisterMenuItem
    End Sub

    ' アドインの除去
    Private Sub Workbook_AddinUninstall()
        On Error Resume Next
        Call m_oSolveButton.Delete
    End Sub

アドインとしてのテストをするために、
メニュー「ツール」⇒「ユーザ設定」を選び、
「ツール」メニュー自体を右クリックしてリセットを選ぶ。
これにより、メニューバーを初期化しておく。

次いで、名前をつけて保存からアドイン形式を選び、
「Nonogram.xla」と名前をつけて保存、
ユーザプロファイル(C:\Documents and Settings\~)の
\Application Data\Microsoft\AddIns に保存される。

一度 Excel を終了し、再度起動、
「ツール」→「アドイン」を選択し、
「Nonogram」をロードする。

パズルの入ったブックを開いて実行……動いた。

もう一度 Excel を終了させ、再度起動する。
今度は最初からロードされているので、
パズルの入ったブックを開いて実行……動いた。

今度は、「ツール」→「アドイン」を選択し、
「Nonogram」をアンロードする。
よし、「ツール」メニューから項目が消えている。