アドインの読み込みまたはアンロードを行うと、アドインのコマンドバーが 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 オブジェクトを使用してメニュー項目を作成すると、メニュー項目がリボンの [アドイン] タブに追加されます。 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
    

注意

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