やりたいこと
エクセルのリボンに自作のタブを追加し、ファイルを開いたときにアクティブなシートに対応したタブをアクティブにしたい。
例)アクティブシートがAの時はタブAを、Bの時はタブBをアクティブにする
結論
スレッドを使って非同期にウェイトをいれた後、対応するタブをアクティブにする
試したこと
関連しそうなイベントとしては、
- ThisWorkbook#Open
- Ribbon#Load
- WorkSheet#Activate
があった。
「WorkSheet#Activate」は、ファイルのオープン時にはそもそも発生しないので除外。
「ThisWorkbook#Open」発生時はリボンがまだ登録されていないのでダメ。
「Ribbon#Load」がよさそうですが、このタイミングでもまだリボンが生成されていないようで失敗。
リボンのLoadが完了したときに発生するイベントがあればいいのだけど、どうもないみたい。
しょうがないので、非同期で、登録が終わったころに目的のタブをアクティブにするようにしたところ、無事動いた。
コード
using System.Threading.Tasks;
namespace MyApp
{
public partial class MyRibbon
{
private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
{
ActivateTabAsync();
}
private async void ActivateTabAsync()
{
// 適当なウェイトかける
await Task.Delay(500);
var sheet = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
if (sheet.Index == Globals.SheetA.Index)
{
RibbonUI.ActivateTab("tabA");
}
else if (sheet.Index == Globals.SheetB.Index)
{
RibbonUI.ActivateTab("tabB");
}
}
}
}
環境
- Excel 2010
- C# 4.0.0.0
- .NET Framework 4.5.2