前提・実現したいこと
C#で書き換えたXMLファイルを1回のデバッグでExcelのVSTOアドインに反映させたい
発生している問題・エラーメッセージ
ExcelのVSTOのボタンの名前やonActionイベント(ボタンクリックイベントのようなもの)の名前をC#側で書き換えた際 xmlファイルに書き換えはされるが、1回目のデバッグでは書き換え前のものが反映されており、2回目以降でないと反映されないです。 1回目に反映されないのはVSTOアドインの仕様なのでしょうか?
該当のソースコード
xml
1//Ribbon1.xml 2<?xml version="1.0" encoding="utf-8"?> 3<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> 4 <ribbon> 5 <tabs> 6 <tab idMso="TabAddIns"> 7 <group id="MyGroup" label="My Group"> 8 <!--今回書き換わるのはlabelとonAction--> 9 <button id="btniId" label="aaaaa" onAction="click_Event"></button> 10 </group> 11 </tab> 12 </tabs> 13 </ribbon> 14</customUI>
C#
1//Ribbon1.cs 2using System; 3using System.Collections.Generic; 4using System.IO; 5using System.Linq; 6using System.Reflection; 7using System.Runtime.InteropServices; 8using System.Text; 9using Office = Microsoft.Office.Core; 10using System.Xml.Linq; 11 12// TODO: リボン (XML) アイテムを有効にするには、次の手順に従います。 13 14// 1: 次のコード ブロックを ThisAddin、ThisWorkbook、ThisDocument のいずれかのクラスにコピーします。 15 16// protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() 17// { 18// return new Ribbon1(); 19// } 20 21// 2. ボタンのクリックなど、ユーザーの操作を処理するためのコールバック メソッドを、このクラスの 22// "リボンのコールバック" 領域に作成します。メモ: このリボンがリボン デザイナーからエクスポートされたものである場合は、 23// イベント ハンドラー内のコードをコールバック メソッドに移動し、リボン拡張機能 (RibbonX) のプログラミング モデルで 24// 動作するように、コードを変更します。 25 26// 3. リボン XML ファイルのコントロール タグに、コードで適切なコールバック メソッドを識別するための属性を割り当てます。 27 28// 詳細については、Visual Studio Tools for Office ヘルプにあるリボン XML のドキュメントを参照してください。 29 30 31namespace ExcelAddIn2 32{ 33 [ComVisible(true)] 34 public class Ribbon1 : Office.IRibbonExtensibility 35 { 36 private Office.IRibbonUI ribbon; 37 38 public Ribbon1() 39 { 40 } 41 42 #region IRibbonExtensibility のメンバー 43 44 public string GetCustomUI(string ribbonID) 45 { 46 return GetResourceText("ExcelAddIn2.Ribbon1.xml"); 47 } 48 49 #endregion 50 51 #region リボンのコールバック 52 //ここでコールバック メソッドを作成します。コールバック メソッドの追加について詳しくは https://go.microsoft.com/fwlink/?LinkID=271226 をご覧ください 53 54 public void Ribbon_Load(Office.IRibbonUI ribbonUI) 55 { 56 this.ribbon = ribbonUI; 57 //xml読み込み 58 XElement xml = XElement.Load(@"C:\Users\信一郎\source\repos\ExcelAddIn2\ExcelAddIn2\Ribbon1.xml"); 59 XNamespace ns = "http://schemas.microsoft.com/office/2009/07/customui"; 60 //指定したタグの中から指定した属性値を持っているタグを絞り込む 61 var info = (from item in xml.Descendants(ns + "button") 62 from att in item.Attributes("id") 63 where att.Value == "btniId" 64 select item).Single(); 65 66 //labal,onActionの値を書き換える 67 info.Attribute("label").Value = "aaaaa"; 68 info.Attribute("onAction").Value = "click_Event"; 69 //指定したxmlファイルに保存 70 xml.Save(@"C:\Users\信一郎\source\repos\ExcelAddIn2\ExcelAddIn2\Ribbon1.xml"); 71 72 //再読み込み 73 xml = XElement.Load(@"C:\Users\信一郎\source\repos\ExcelAddIn2\ExcelAddIn2\Ribbon1.xml"); 74 75 76 77 } 78 public void click_Event(Office.IRibbonControl control) 79 { 80 System.Windows.Forms.MessageBox.Show("ボタンが押されました"); 81 } 82 83 #endregion 84 85 #region ヘルパー 86 87 private static string GetResourceText(string resourceName) 88 { 89 Assembly asm = Assembly.GetExecutingAssembly(); 90 string[] resourceNames = asm.GetManifestResourceNames(); 91 for (int i = 0; i < resourceNames.Length; ++i) 92 { 93 if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0) 94 { 95 using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i]))) 96 { 97 if (resourceReader != null) 98 { 99 return resourceReader.ReadToEnd(); 100 } 101 } 102 } 103 } 104 return null; 105 } 106 107 #endregion 108 } 109}
C#
1//ThisAddIn.cs 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Xml.Linq; 7using Excel = Microsoft.Office.Interop.Excel; 8using Office = Microsoft.Office.Core; 9using Microsoft.Office.Tools.Excel; 10 11 12namespace ExcelAddIn2 13{ 14 public partial class ThisAddIn 15 { 16 protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() 17 { 18 return new Ribbon1(); 19 } 20 private void ThisAddIn_Startup(object sender, System.EventArgs e) 21 { 22 } 23 24 private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 25 { 26 } 27 28 #region VSTO で生成されたコード 29 30 /// <summary> 31 /// デザイナーのサポートに必要なメソッドです。 32 /// コード エディターで変更しないでください。 33 /// </summary> 34 private void InternalStartup() 35 { 36 this.Startup += new System.EventHandler(ThisAddIn_Startup); 37 this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 38 } 39 40 #endregion 41 } 42}
試したこと
Ribbon_Loadよりも前に参照する場所(ThisAddIn.csのThisAddIn_Startup, CreateRibbonExtensibilityObject()など)に処理を記載してみたが
結果は変わらず、2回目以降でないとボタンの名前は変わりませんでした。
補足情報(FW/ツールのバージョンなど)
Excel 2016
VisualStudio 2019
.Net Framework 4.7.2
あなたの回答
tips
プレビュー