【问题标题】:Excel VSTO access sheet name through ThisAddIn StartUpExcel VSTO 通过 ThisAddIn StartUp 访问工作表名称
【发布时间】:2018-01-09 20:26:34
【问题描述】:

我被困住了,希望能在这里得到一些帮助。我有一个带有包含各种控件的功能区的 Excel VSTO 加载项。除非具有特定名称的工作表处于活动状态,否则我希望禁用除一个控件之外的所有控件。这是如何实现的?到目前为止,我想出了如何将功能区按钮映射到 ThisAddIn 启动以使其保持活动状态,而其他按钮默认为禁用:

RibbonButton btx_newECO = Globals.Ribbons.Ribbon1.btn_ECOnumber;
btx_newECO.Enabled = true;

现在,当打开具有特定名称的工作表时,如何启用其他功能区按钮? `

【问题讨论】:

    标签: excel vsto ribbon


    【解决方案1】:

    我的回答假设功能区是在设计时使用功能区设计器定义的。从您的代码看来,这就是您正在做的事情(而不是使用 Ribbon XML)。

    请注意,在 Ribbon 类的类级别声明了一个字段,并在 ThisAddin_Startup 事件中填充该字段,以便在插件的“生命周期”期间随时可以使用它。

    此外,应用程序的 SheetActivate 事件被实例化。每次激活不同的工作表时都会触发。如果检查了工作表的名称。如果是正确的,则启用功能区按钮;否则按钮将被禁用。

    我在功能区设计器属性中将按钮设置为默认禁用。但如果您愿意,也可以在 Ribbon 类 Load 事件中禁用它。

        public partial class ThisAddIn
    {
        Ribbon1 rbn;
        string triggerName = "X";
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            rbn = Globals.Ribbons.Ribbon1;
            this.Application.SheetActivate += new Excel.AppEvents_SheetActivateEventHandler(Application_SheetActivate);
        }
    
        void Application_SheetActivate(object Sh)
        {
            Excel.Worksheet wsh = (Excel.Worksheet)Sh;
            if (wsh.Name == triggerName)
            {
                rbn.btnMsg.Enabled = true;
            }
            else { rbn.btnMsg.Enabled = false; }
        }
    
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
    
        #region VSTO generated code
    }
    

    【讨论】:

    • 嗨 Cindy,感谢您回答我的问题。我将您的代码添加到 ThisAddIn 并发现它仅在我在现有 Excel 工作簿中创建新工作表时才起作用,然后将其重命名为满意的 triggerName。 Excel 有没有办法在打开的工作表中检测工作表名称或范围,以便自动禁用功能区项目?再次感谢:)
    • 你的意思是当工作簿打开时?有一个事件你应该能够以几乎相同的方式使用 - 我现在不记得确切的名称,也没有坐在我可以查看的机器上,现在......
    【解决方案2】:

    好的,Cindy 让我朝着正确的方向前进。我没有使用 SheetActivateHandler,而是使用了 WorkBookOpenHandler。我不知道我可以通过这种方式分配事件处理程序。我今天完全学会了这一点。谢谢,辛迪 :)

    --这个插件---

    public partial class ThisAddIn
    {
        Ribbon1 rbn;
        string triggerName = "ECO";
    
        #region StartUp
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //detect the sheet name on workbook open event
            rbn = Globals.Ribbons.Ribbon1;
            this.Application.WorkbookOpen+= new Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
        }
    
        #endregion
    
        #region Enable Ribbon Buttons
        void Application_WorkbookOpen(object Sh)
        {
            Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
            if (ws.Name == triggerName)
            {
                rbn.btn_ECOnumber.Enabled = false;
            } 
        }
        #endregion
    

    ---关机和VSTO在这里生成代码-----

    【讨论】:

    • 嗨,贾斯汀。很高兴你找到了一些有用的东西。由于您是 StackOverflow 的新手:您应该为您的问题标记“答案”,以便人们知道它已被解决,并且其他有相同问题的人可以看到有什么帮助。您还应该为任何有帮助的贡献点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多