2016-12-14 9 views
2

Я делаю добавление Excel. Она состоит из нескольких функций в модуле, как это:Когда устанавливать MacroOptions для Excel Addin

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. Таким образом, эти функции доступны каждый раз, когда я запускаю новый лист распространения.

Недавно я узнал, что могу назначить свои функции категории, что действительно полезно. Это упрощает их использование с помощью мастера функций 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 

Теперь, если я вручную запустить макрос, MyRegister, функции все получить новую категорию, и она работает очень хорошо. Но я не хочу, чтобы вручную запускать макрос каждый раз, когда я запускаю новую таблицу. Мои вопросы: как добавление может делать это автоматически для каждой новой таблицы?

Я попытался положить его в Workbook_Open в надстройке, как это:

Private Sub Workbook_Open() 
    Call MyRegister 
End Sub 

Проблема заключается в том, что она не работает. Всякий раз, когда Excel запускается, я получаю сообщение об ошибке: «Cannot edit a macro on a hidden workbook.» Таким образом, событие Workbook_Open представляется неправильным местом для этого.

Так что мой вопрос: как я могу запустить макрос MyRegister в соответствующее время, чтобы назначить мои функции добавления в категории?

Кстати, я действительно не хочу создавать шаблон. Я действительно должен держать это как только и добавить.

Спасибо!

ответ

1

Вместо использования 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 

Это путь он будет работать, когда учебное пособие является активным, и вы будете избежать ошибки вы получаете.

1

Практически там. Просто конвертируйте надстройку в обычную рабочую книгу, установите параметры и сбросьте ее как надстройку. Подробнее см. Комментарии к коду.

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