Можно ли изменить ссылки Excel VBA во время выполнения (после загрузки надстройки во время выполнения)? - PullRequest
3 голосов
/ 12 августа 2011

При динамической загрузке надстройки Excel 2010 необходимо также изменить ссылки на VBA, чтобы включить недавно добавленную надстройку после ее загрузки в книгу.

Этот код работает для программной загрузки надстройки:

Function LoadAddin(strFilePath As String) As Boolean
   ' Checks whether add-in is in collection, and
   ' then loads it. To call this procedure, pass
   ' in add-in's path and file name.

   Dim addXL            As Excel.AddIn
   Dim strAddInName     As String

   On Error Resume Next
   ' Call ParsePath function to return file name only.
   'strAddInName = ParsePath(strFilePath, FILE_ONLY)    'not available in VBA...so it seems to always physically load it below, which seems to work fine.
   ' Remove extension from file name to get add-in name.
   strAddInName = Left(strAddInName, Len(strAddInName) - 4)
   ' Attempt to return reference to add-in.
   Set addXL = Excel.AddIns(strAddInName)
   If err <> 0 Then
      err.Clear
      ' If add-in is not in collection, add it.
      Set addXL = Excel.AddIns.Add(strFilePath)
      If err <> 0 Then
         ' If error occurs, exit procedure.
         LoadAddin = False
         GoTo exit_function
      End If
   End If
   ' Load add-in.
   If Not addXL.Installed Then addXL.Installed = True
   LoadAddin = True

exit_function:
   Exit Function
End Function

Итак, есть ли способ добавить это в References, чтобы код VBA в электронной таблице хоста, который ссылается на VBA в этой недавно включенной надстройке, работал правильно?

Похоже, что маршрут может быть что-то вроде:

ThisWorkbook.VBProject.References.AddFromFile ("C:\MyFiles\MyAddin.xlam")

... но это дает мне ошибку:

Microsoft Visual Basic for Applications
Run-time error '32813':
Application-defined or object-defined error

1 Ответ

0 голосов
/ 29 февраля 2012

Рассматривали ли вы использование того же кода (но слегка измененного) в событии открытия Workbook надстройки?

Если я вас правильно понимаю, то, наверное, это то, что вам нужно?

Public ShouldIContinue As Boolean

Private Sub Workbook_Open()
    '~~> This is required to avoid the endless loop
    If ShouldIContinue = True Then Exit Sub

    Dim addXL As AddIn
    Dim strAddInName As String
    Dim oTempBk As Workbook

    strFilePath = ThisWorkbook.FullName

    strAddInName = ThisWorkbook.Name
    '~~> This will work for both .xla and .xlam
    strAddInName = Left(strAddInName, (InStrRev(strAddInName, ".", -1, _
    vbTextCompare) - 1))

    On Error Resume Next
    Set addXL = Excel.AddIns(strAddInName)
    On Error GoTo 0

    If Not addXL Is Nothing Then Exit Sub

    '~~> This is required to avoid the Run-time error '1004':
    '~~> "Unable to get the Add property of the AddIns class"
    '~~> OR
    '~~> "Add method of addins class failed"
    '~~> when there are no workbooks
    Set oTempBk = Workbooks.Add

    Set addXL = AddIns.Add(strFilePath, True)
    addXL.Installed = True

    oTempBk.Close

    ShouldIContinue = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...