アドインの読み込みまたはアンロード時に、アドインのコマンド バーが Excel 2013 以降で表示または削除されない

現象

Microsoft Excel 2013以降でアドインを使用すると、次の問題が発生します。

問題 1

Excel アドイン (xlam) または Excel 97-2003 アドイン (xla) を読み込むと、アドインのコマンド バーは自動的に表示されません。 代わりに、すべてのブックを閉じ、Excel を再起動してコマンド バーを表示する必要があります。

問題 2

Excel アドイン (.xlam) または Excel 97-2003 アドイン (.xla) をアンロードしたり、コマンド バーを含む Excel マクロ対応ブック (.xlsm) を閉じると、アドインまたはマクロ対応ブックのコマンド バーが開いているブックから削除されることはありません。

原因

これらの問題は、Excel 2013 以降の単一ドキュメント インターフェイス (SDI) が原因で発生します。 従来の CommandBar オブジェクトを使用してメニュー項目を作成すると、メニュー項目がリボンの [Add-Ins] タブに追加されます。 Excel 2013 以降では、各ブックに独自のリボンがあります。 そのため、ブックのリボンが作成された後にアドインを読み込みまたはアンロードしても、リボンは更新されません。

次のコード サンプルでは、CommandBar オブジェクトを使用してメニュー項目を作成します。

Application.CommandBars("Worksheet Menu Bar").Controls.Add Type:=msoControlPopup

回避策

問題 1 を回避するには、開いているすべてのブックを閉じてから、Excel を再起動します。

問題 2 を回避するには、次のいずれかの方法を使用します。

  • コマンド バーを、アドインまたはマクロが有効なブックのリボン (XML) 項目に置き換えます。 リボン (XML) の詳細については、「 リボン XML」を参照してください。

  • アドインまたはマクロが有効なブックのWorkbook_BeforeCloseイベントで、開いているウィンドウをすべてループして、コマンド バーを削除します。 コード サンプルを次に示します。

    For Each wnd In Application.Windows
            wnd.Activate
            Application.CommandBars("<ToolbarName>").Delete
    Next wnd
    

注:

このコードでは、プレースホルダー <ToolbarName> はコマンド バー名を表します。