何时为Excel Addin设置MacroOptions

我在做一个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 

我已经将整个事情保存为一个.xlam Excel Addin。 所以每当我开始一个新的电子表格,这些function是可用的。

我最近了解到,我可以将我的function分配给一个类别,这真的很有帮助。 这使得它们易于从Excelfunction向导中使用。 我使用下面的代码来分配类别:

 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 

现在,如果我手动运行macros,我的MyRegister ,function都获得了新的类别,它工作得很好。 但是我不想每次开始一个新的电子表格都要手动运行这个macros。 我的问题是,插件如何自动为每个新的电子表格?

我试着把它放在插件的Workbook_Open中,像这样:

 Private Sub Workbook_Open() Call MyRegister End Sub 

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

所以我的问题是,如何在适当的时候运行MyRegistermacros来将我的插件function分配给类别?

顺便说一下,我真的不想做一个模板。 我真的要保持这一点,只是和插件。

谢谢!

而不是使用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 

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

差不多了。 只要将加载项转换为普通工作簿,设置选项并将其重置为加载项即可。 详情请参阅代码注释。

 Public Sub MyRegister() Application.ScreenUpdating = False '/ Turn it off to avoid flicker. ThisWorkbook.IsAddin = False '/ Make the add-in workbook as normal, hence unhiding sheets 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" ThisWorkbook.IsAddin = True '/ Set back as add-in, hides everything. Application.ScreenUpdating = True '/ Turn on screen updating End Sub