2009-05-28 16 views

Odpowiedz

6

Jest to nieco hacky sposób to zrobić, ponieważ opiera się na posiadaniu ustaw „On Error Resume Next”, ale można zrobić coś takiego:

On Error Resume Next 
Dim objRef1, objRef2 
Set objRef1 = GetRef("DoStuff1") 
If objRef1 Is Nothing Then 
    Call objRef1 
Else 
    MsgBox "DoStuff1 is not defined!" 
End If 

Set objRef2 = GetRef("DoStuff2") 
If objRef2 Is Nothing Then 
    MsgBox "DoStuff2 is not defined!" 
Else 
    Call objRef2 
End If 

Sub DoStuff1 
    MsgBox "DoStuff1!" 
End Sub 

Wezwanie do GetRef wygeneruje wyjątek, jeśli sub lub funkcja, którą próbujesz uzyskać, aby wskaźnik nie istniał (tak jak w przypadku tutaj z DoStuff2). Następnie możesz sprawdzić, czy odniesienie zostało ustawione zgodnie z oczekiwaniami.

+0

W przeciwnym razie jesteś na sprawdzenie Err.Number po próbie wywołania funkcji. Ale wtedy funkcja, którą wywołujesz, może zostać zdefiniowana, zostać wywołana, ale być źródłem błędu, który, jak sądzę, nie jest tym, czego potrzebujesz. – Xiaofu

+0

To działa. Dzięki! –

15

Oto moje rozwiązanie, które działa na tej samej zasadzie, ale hacky-ności jest dość powściągliwy:

Function FunctionExists(func_name) 
    FunctionExists = False 

    On Error Resume Next 

    Dim f : Set f = GetRef(func_name) 

    If Err.number = 0 Then 
     FunctionExists = True 
    End If 
    On Error GoTo 0 

End Function 
+2

Tak, właśnie to z nim skończyłem. :-) –

+1

Możesz uprościć to do 'FunctionExists = (Err.Number = 0)', aby ustawić 'Boolean'. – Lankymart

+0

@Lankymart, nie działa tak samo. Nie wiem, dlaczego nie. –