何时为 Excel 插件设置 MacroOptions

car*_*le1 4 excel vba excel-addins

我正在制作一个 Excel 插件。它由模块中的几个函数组成,如下所示:

Public Function MyFunctionOne(X As Range, Y As Double) As Double
    MyFunctionOne = 1 'Example
End Function
Public Function MyFunctionTwo(X As Range, Y As Double) As Double
    MyFunctionTwo =  2 'Example
End Function
Public Function MyFunctionThree(X As Range, Y As Double) As Double
    MyFunctionThree =  3 'Example
End Function
Run Code Online (Sandbox Code Playgroud)

我已将整个内容保存为.xlamExcel 插件。因此,每次我启动新的电子表格时,这些功能都可用。

我最近了解到我可以将我的功能分配给一个类别,这非常有帮助。这使得它们可以通过 Excel 函数向导轻松使用。我使用以下代码来分配类别:

Public Sub MyRegister()
    Application.MacroOptions Macro:="MyFunctionOne", Description:="Returns 1", Category:="My New Category"
    Application.MacroOptions Macro:="MyFunctionTwo", Description:="Returns 2", Category:="My New Category"
    Application.MacroOptions Macro:="MyFunctionThree", Description:="Returns 3", Category:="My New Category"
End Sub
Run Code Online (Sandbox Code Playgroud)

现在,如果我手动运行宏,MyRegister则所有函数都会获得新类别,并且效果非常好。但我不想每次启动新电子表格时都手动运行宏。我的问题是,插件如何为每个新电子表格自动执行此操作?

我尝试将其放入Workbook_Open插件中,如下所示:

Private Sub Workbook_Open()
    Call MyRegister
End Sub
Run Code Online (Sandbox Code Playgroud)

问题是它不起作用。每当 Excel 启动时,我都会收到错误消息:“无法编辑隐藏工作簿上的宏。 ”因此该Workbook_Open事件似乎是执行此操作的错误位置。

所以我的问题是,如何MyRegister在适当的时间运行宏以将我的插件函数分配给类别?

顺便说一句,我真的不想做模板。我真的要把它保留为唯一的插件。

谢谢!

小智 5

Workbook_Open您可以这样做,而不是使用:

Private WithEvents App As Application

Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
    MyRegister
End Sub

Private Sub Workbook_Open()
    Set App = Application
End Sub
Run Code Online (Sandbox Code Playgroud)

这样,它将在工作簿处于活动状态时运行,并且您将避免出现错误。