何时为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
事件似乎是错误的地方。
所以我的问题是,如何在适当的时候运行MyRegister
macros来将我的插件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