知りたいこと
その1. VSTOでxmlリボンの追加・使用の仕方を知りたい。 (通常のxmlリボン追加)
その2. VSTOのxmlリボンを参照で追加した場合の追加・使用の仕方を知りたい。 (参照でのxmlリボン追加)

VSTO リボン(xml)でのリボンの追加について
わかったこと その1. 通常でのxmlリボン追加
A. xmlコードでの注意点
ネットに書かれている通りの方法で概ね追加可能だが、少し注意が必要。
要点としては、idMso=”TabAddins”を id=”CustomTabs”などに変更することで追加されます。個人的にしばらく気づかなくて、デザイナーでの作成ばかりしてました。
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
<!-- この部分に注意 『id』にしてます -->
<tab id="CustomTabs" label="カスタム">
<group id="MyGroup"
label="My Group">
</group>
</tab>
</tabs>
</ribbon>
</customUI>
参考リンク
カスタムタブが表示されなくなる(VSTO)
リボンXML -Visual Studio ドキュメント
Outlookは注意が必要。特にグループの場合。
B. xmlリボンのコード追加
以下のコードThisAddin.cs等にに追加する必要があります。 リボンXML -Visual Studio ドキュメントを参考してください。
以下のコードを張り付けてください。MyRibbon()の部分は自分で作成するクラス・プロジェクトの名前になるかとおもいます。
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new MyRibbon();
}
その2 参照での追加
xmlリボンにすることにより、参照での追加をすることが可能になったわけですが、『プロジェクトを右クリック→追加→既存の項目』で既存の項目でxmlリボンを追加しても、リボンが呼ばれてきません。
次の2つを行うことで解決可能です。
- .cs側のGetCustomUI()関数の中で参照追加された.xmlファイルの正しい名前が追加されていること。
- Outlookでは、さらに細かな区切りをGetCustomUI()関数の中で行う必要あります。(Outlookは注意が必要。特にグループの場合。参照)
- 参照追加された.xmlのプロパティの『詳細→ビルドアクション』が『埋め込みリソース』になっていることが必要です。
理由は以下の画像の中にも書いていますが、リボンを実行形式である埋め込みリソースとして、正しく呼び出すことが必要だからだと考えています。


参考に上記画像のコード貼り付けておきます。ご活用ください。
public string GetCustomUI(string ribbonID)
{
// リボンのxmlを参照で追加する場合は、リボンのプロジェクトの設定にてビルドアクションに「埋め込みリソース」とすること。
// <!--通常はビルドアクションにコンテンツをしていするが、ビルドアクションに埋め込みリソースをしていすること-->
// そうしないとここで対象となる.xmlがりすとアップされません。
if( ribbonID.Contains("Excel") )
{
return GetResourceText("CodeCipher_Excel_AddIn.Ribbon_Common_CodeCipher.xml");
}
else if (ribbonID.Contains("Word"))
{
return GetResourceText("CodeCipher_Word_AddIn.Ribbon_Common_CodeCipher.xml");
}
else if (ribbonID.Contains("PowerPoint"))
{
return GetResourceText("CodeCipher_PowerPoint_AddIn.Ribbon_Common_CodeCipher.xml");
}
else if (ribbonID.Contains("Outlook"))
{
#region
// outlook の場合さらに場合を区切る必要があります。
//return GetResourceText("CodeCipher_Outlook_AddIn.Ribbon_Common_CodeCipher.xml");
#endregion
if (ribbonID == "Microsoft.Outlook.Explorer")
{
return GetResourceText("CodeCipher_Outlook_AddIn.Ribbon_Common_CodeCipher.xml");
}
}
return null;
}
参考リンク Xmlリボンで参照にさせてもらったきじです。
【VAOT】複数個のリボンの読み込みを行う
【VSTO】Outlookのインライン返信対応のアドイン
感想
ながらく上記2点の問題の切り口がわからなかったので、リボンはデザイナのみで作成してましたが、これで心置きなくxmlリボンで作成できます。
自分がしらなかっただけだと思うんですが、共通のアドインでリボンを使用して作成する場合には有効な手法化と思いました。WPFの本を昔読んだ際に得た知識が少し活きたように思います。

