2013-04-24 4 views
0

Как я могу проверить с помощью VBA, что суб-функция существует в книге?Excel VBA - проверьте, существует ли функция/суб в другой книге

Я пишу макрос, включающий вызов на суб в другой книге. Я могу заставить sub в другой книге работать нормально, используя код в оригинальной книге, я пытаюсь найти хороший способ сначала проверить, существует ли субо/функция (обработка ошибок в случае, если суб было переименовано и т. Д.), ,

Я искал в Интернете и вижу пример проверки наличия модуля, любая помощь по этому поводу будет оценена!

Спасибо,

Адам

+1

Перед вызовом функции используйте 'On error Goto ...'. –

+1

Что должно делать @iDevlop. Убедитесь, что вы сразу же положили 'On Error GoTo 0' ** после ** вызова функции, чтобы возобновить обычную обработку ошибок и включить блок обработки ошибок, чтобы сообщить пользователю и выйти из подкаталога, если возникла ошибка. –

ответ

2

вы можете обрабатывать ошибку с отсутствующим procesure, или вы можете использовать Visual Basic для приложений расширяемости библиотеки

Это хорошо документированы на Chip Pearson's website

вот код, который я нашел на Сайт Chip Peartsons age ago и изменен:

Option Explicit  

Function checkProcName(wBook As Workbook, sModuleName As String, sProcName As String) As Boolean 
' =========================================================================== 
' Found on http://www.cpearson.com at http://www.cpearson.com/excel/vbe.aspx 
' then modified 
' 
' USAGE: 
' to check if a procedure exists, call 'checkProcName' passing 
' in the target workbook (which should be open), the Module, 
' and the procedure name 
' 
' =========================================================================== 
Dim VBProj As VBIDE.VBProject 
Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 

Dim ProcName As String 
Dim LineNum As Integer 
Dim ProcKind As VBIDE.vbext_ProcKind 

    checkProcName = False 

    Set VBProj = wBook.VBProject 
    Set VBComp = VBProj.VBComponents(sModuleName) 
    Set CodeMod = VBComp.CodeModule 

    With CodeMod 
     LineNum = .CountOfDeclarationLines + 1 
     Do Until LineNum >= .CountOfLines 
      ProcName = .ProcOfLine(LineNum, ProcKind) 
      If ProcName = sProcName Then 
       checkProcName = True 
       Exit Do 
      End If 
      Debug.Print ProcName 
      LineNum = .ProcStartLine(ProcName, ProcKind) + .ProcCountLines(ProcName, ProcKind) + 1 
     Loop 
    End With 


End Function 

Function ProcKindString(ProcKind As VBIDE.vbext_ProcKind) As String 
    Select Case ProcKind 
     Case vbext_pk_Get 
      ProcKindString = "Property Get" 
     Case vbext_pk_Let 
      ProcKindString = "Property Let" 
     Case vbext_pk_Set 
      ProcKindString = "Property Set" 
     Case vbext_pk_Proc 
      ProcKindString = "Sub Or Function" 
     Case Else 
      ProcKindString = "Unknown Type: " & CStr(ProcKind) 
    End Select 
End Function 
+0

Отлично работает, большое спасибо! – AdamDynamic

Смежные вопросы