【发布时间】:2010-01-05 18:57:50
【问题描述】:
当 VSTO 代码在 Excel 2007 中创建列表对象并应用表格样式时,表格工具/设计选项卡会自动激活。当用户随后选择非表格单元格时,默认情况下会激活“主页”选项卡。有没有办法抑制这种行为或将活动选项卡重置为启动操作的自定义选项卡?我希望自定义功能区在创建表格的操作之后可见。
【问题讨论】:
标签: vsto excel-2007
当 VSTO 代码在 Excel 2007 中创建列表对象并应用表格样式时,表格工具/设计选项卡会自动激活。当用户随后选择非表格单元格时,默认情况下会激活“主页”选项卡。有没有办法抑制这种行为或将活动选项卡重置为启动操作的自定义选项卡?我希望自定义功能区在创建表格的操作之后可见。
【问题讨论】:
标签: vsto excel-2007
我也在another post 中提供了同样的答案。
在 VSTO2010 中,能够以编程方式切换选定的选项卡 加入。 Norm Estabrook blogged 关于它。
this.RibbonUI.ActivateTabMso("TabAddIns");因此,虽然没有可以锁定的事件,但至少您 可以切换选中的标签。例如,我将使用工作表 选择事件;当用户在我的不同工作表之间切换时 工作簿,我将更改他们选择的选项卡。每张纸都会 对应不同的功能区选项卡。
如果将此与工作表 SelectionChanged 事件配对,则可以确保它们在更改所选单元格后被带回相应的选项卡(而不是 TabHome)。
【讨论】:
我不认为你会认为这是一个“答案”,但我能找到的最好的事情是 MSDN 上有人建议我为功能区分配一个键盘快捷键,然后在我假设时使用 Application.SendKeys 选择它用户将需要查看功能区(在我创建初始表等后启动时)
祝你好运,我希望你能找到更好的答案 - 在这种情况下,我很乐意更新我的应用程序!
【讨论】:
编辑:我终于发现了一个结合了原生 C# 功能区操作的 code.msdn.microsoft.com project。使用它而不是任何 VBA 业务。
原帖:
Office 2010 允许您使用ribbon extensibility model 激活选项卡。但是,它没有提供任何方法来知道哪个选项卡处于活动状态或知道选项卡是否已更改 AFAIK。此外,选项卡激活在 2007 年不可用。希望这些是他们在下一个版本中添加的内容。
但无论如何some guys found a way to access 功能区中的IAccessible 对象。使用这些方法,您几乎可以使用功能区做任何您想做的事情。我已经尝试将它移植到 C#,但我遇到了,并且听说其他人也遇到了 AccessibleChildren pinvoke 函数的内存泄漏问题,所以如果有人找到一种在 C# 中本地执行此操作的方法,请分享。
作为一种解决方法,我从他们的网站修改了 .dotm 文件中包含的 VBA 函数,将 VBA 代码放在我的应用程序的属性设置中,并在我需要找出当前选项卡名称时在我的工作簿中创建和销毁 VBA 模块.
public static string GetRibbonName()
{
Excel.Workbook wbk = Globals.ThisWorkbook.Application.ActiveWorkbook;
VBIDE.VBComponent module1 = null; //contains the function I want
VBIDE.VBComponent module2 = null; //contains helper functions
object obj = null;
ThisRibbonCollection rbn = new ThisRibbonCollection();
module1 = wbk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
module2 = wbk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
module1.CodeModule.AddFromString(Forecast_Toolset.Properties.Settings.Default.Module1);
module2.CodeModule.AddFromString(Forecast_Toolset.Properties.Settings.Default.Module2);
obj = wbk.Application.Run("TabName");
wbk.VBProject.VBComponents.Remove(module1);
wbk.VBProject.VBComponents.Remove(module2);
return obj.ToString();
}
【讨论】:
仅适用于所有必须支持 Office 2007 的人(比如我)。这是 Office 2007 的(丑陋,但有效)解决方案:
希望它可以帮助某人。问候,约尔格
代码:
public void FocusMyCustomRibbonTab()
{
if (IsExcel2007())
{
Globals.Ribbons.GetRibbon<MyRibbon>().tabMyRibbonTab.KeyTip = "GGG";
//Excel 2007: Must send "ALT" key combination to activate tab, here "GGG"
SendKeys.Send("%");
SendKeys.Send("{G}");
SendKeys.Send("{G}");
SendKeys.Send("{G}");
SendKeys.Send("%");
}
else
{
//Excel 2010 or higher: Build in way to activate tab
if (this.ribbon.RibbonUI != null)
{
this.ribbon.RibbonUI.ActivateTab("MY_RIBBON_TAB_NAME");
}
}
}
public static bool IsExcel2007()
{
return (Globals.ThisAddIn.Application.Version.StartsWith("12"));
}
【讨论】: