2016-02-27 2 views
0

Итак, у меня есть .xlam AddIn с несколькими UDF в нем. В качестве обходного пути к хорошо известному absolute path problem я ввожу мой UDF к текущей рабочей книге, так что UDFs может быть вызван из Workbook, а не из надстройки, используя следующий код:VBA importing udf module from Add In to Workbook

Sub CopyOneModule() 
Dim FName As String 
On Error GoTo errhandler 
With ThisWorkbook 
    FName = .Path & "\code.txt" 
    .VBProject.VBComponents("HMFunctions").Export FName 
End With 
ActiveWorkbook.VBProject.VBComponents.Import FName 
MsgBox ("Functions successfully imported") 
errhandler: 
If Err.Number <> 0 Then 
     Select Case Err.Number 
     Case Is = 0: 
     Case Is = 1004: 
      MsgBox "Please allow access to Object Model and try again.", vbCritical, "No Access granted" 
     End Select 
End If 

Это, кажется, работает хорошо. Итак, мой (возможно, немой) вопрос: есть ли способ заставить книгу с импортированными UDF «отменить» тот же модуль, который хранится в AddIn? Необходимо избегать следующей ситуации, которая может быть очень запутанной: 2 functions instead of 1

Благодарим вас заблаговременно.

+0

Не могли бы вы просто выгрузить или отключить надстройку? В противном случае вы могли бы заменить текст в файле txt перед импортом? – snoopen

+0

Например, у надстройки может быть выделенное частное имя udf, которое вы можете удалить в txt-файле – snoopen

+0

Большое вам спасибо! Я просто заменил в своем фиктивном текстовом файле, и теперь все работает так, как я этого хочу. – Salabon11

ответ

0

Удаление личных ярлыков из временного текстового файла, как предложено snoopen, работало как шарм. Вопрос закрыт. Вот последний код, который я использую для импорта:

Sub CopyOneModule() 
Dim FName As String 
Dim FileContent As String 
Dim TextFile As Integer 
Dim ws As Workbook 

Set ws = ActiveWorkbook 

On Error GoTo errhandler 
With ThisWorkbook 
    FName = .Path & "\code.txt" 
    .VBProject.VBComponents("HMFunctions").Export FName 
End With 

TextFile = FreeFile 
Open FName For Input As TextFile 
FileContent = Input(LOF(TextFile), TextFile) 
Close TextFile 
FileContent = Replace(FileContent, "Private", "") 
TextFile = FreeFile 
Open FName For Output As TextFile 
Print #TextFile, FileContent 
Close TextFile 

ws.VBProject.VBComponents.Import FName 
MsgBox ("Functions successfully imported") 
errhandler: 
If Err.Number <> 0 Then 
     Select Case Err.Number 
     Case Is = 0: 
     Case Is = 1004: 
      MsgBox "Please allow access to Object Model and try again.", vbCritical, "No Access granted" 
     End Select 
    End If 

End Sub