在Excel中选择VSTO自定义功能区

时间:2010-01-05 18:57:51

标签: vsto excel-2007

当VSTO代码创建列表对象并在Excel 2007中应用表格样式时,将自动激活“表格工具/设计”选项卡。当用户然后选择非表格单元格时,默认情况下会激活“主页”选项卡。有没有办法抑制此行为或将活动选项卡重置为启动操作的自定义选项卡?我想要的是在创建表格的操作之后可以看到自定义功能区。

4 个答案:

答案 0 :(得分:2)

我也在another post中提供了相同的答案。

  

在VSTO2010中,能够以编程方式切换选定的选项卡   加入。 Norm Estabrook blogged关于它。

this.RibbonUI.ActivateTabMso("TabAddIns");
     

所以虽然没有可以锁定的事件,至少你是   可以切换选定的选项卡。例如,我打算使用这张纸   选拔活动;当用户在我的不同床单之间切换时   工作簿,我要更改他们选择的选项卡。每张纸都会   对应于不同的功能区选项卡。

如果将其与工作表SelectionChanged事件配对,则可以确保在更改所选单元格后将它们恢复到相应的选项卡(而不是TabHome)。

答案 1 :(得分:0)

我认为你不会认为这是一个“答案”,但我能找到的最好的东西是MSDN上有人建议我为功能区分配一个键盘快捷键,然后使用Application.SendKeys选择它时我假设用户需要查看功能区(在创建初始表后启动时等)

祝你好运,我希望你找到更好的答案 - 我很乐意在这种情况下更新我的申请!

答案 2 :(得分:0)

修改:我终于发现了一个包含原生C#功能区操作的 code.msdn.microsoft.com project 。使用它而不是任何VBA业务。

原帖:

Office 2010允许您使用ribbon extensibility model激活选项卡。但是,它没有提供任何方法来了解哪个选项卡处于活动状态或知道选项卡是否已更改AFAIK。此外,2007年没有标签激活。希望这些是他们在下一个版本中添加的内容。

但无论如何{* 3}}功能区中的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();

    }        

答案 3 :(得分:0)

仅适用于所有必须支持Office 2007的人(像我一样)。这是Office 2007的一个(丑陋,但有效)解决方案:

  1. 打开办公室应用程序
  2. 按ALT键,然后查看自定义功能区选项卡的键盘快捷键
  3. 在您的代码中,您现在可以通过 SendKeys.SendWait 功能发送此密钥
  4. 希望它有所帮助。此致,Jörg


    代码:

        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"));
        }