2010-04-22 3 views
6

Łatwo jest wywołać funkcję wewnątrz modułu klasy za pomocą CallByName Co powiesz na funkcje wewnątrz standardowego modułu?Wywołanie Sub lub funkcji zawartej w module przy użyciu "CallByName" w VB/VBA

''#inside class module 
''#classModule name: clsExample 
    Function classFunc1() 
    MsgBox "I'm class module 1" 
    End Function 
''# 
''#inside standard module 
''#Module name: module1 
    Function Func1() 
    MsgBox "I'm standard module 1" 
    End Function 
''# 
''# The main sub 
Sub Main() 
''# to call function inside class module 
dim clsObj as New clsExample 
Call CallByName(clsObj,"ClassFunc1") 

''# here's the question... how to call a function inside a standard module 
''# how to declare the object "stdObj" in reference to module1? 
Call CallByName(stdObj,"Func1") ''# is this correct? 

End Sub 
+1

Nie możesz. Wyszukaj "Application.Run", który działa z procedurami w standardowych modułach. – jtolle

+0

Ponieważ twoje "funkcje" nie odpowiadają wartościom, powinieneś użyć 'Sub' zamiast' Function'. 'Call' nigdy nie jest wymagane, możesz po prostu napisać' CallByName clsObj, "ClassFunc1" '. Aby wywołać funkcję Func1 wewnątrz standardowego modułu jest tak proste, jak 'Func1' - użyj odpowiednich modyfikatorów w deklaracji, aby zmienić zakres w razie potrzeby – barrowc

Odpowiedz

2

CallByName działa tylko z obiektami klasy.

Jeśli podprogram jest w standardowym module, można to zrobić:

Sub Main() 
    Module1.Func1 
End Sub 

Jeśli jest to funkcja, to prawdopodobnie będziesz chciał, aby uchwycić wartości zwracanej; coś takiego:

Sub Main() 
    Dim var 
    var = Module1.Func1 
End Sub 
3

Myślę, że odpowiedź jtolle odnosiła się do pytania najlepiej - małe odniesienie do Application.Run może być odpowiedzią. Pytający nie chce używać po prostu func1 lub Module1.func1 - powodem, dla którego ktoś chciałby używać CallByName, jest to, że pożądana nazwa function.sub nie jest znana podczas kompilacji. W tym przypadku, Application.Run działa, np .:

Dim ModuleName As String 
Dim FuncName As String 
Module1Name = "Module1" 
FuncName = "func1" 
Application.Run ModuleName & "." & FuncName 

Można również poprzedzić nazwę projektu przed modulename i dodać kolejny okres „”. Niestety, Application.Run nie zwraca żadnych wartości, więc dopóki nie możesz wywołać funkcji, nie otrzymasz jej wartości zwracanej.

+3

To jest frustrujące. Najwyraźniej mądrość internetowa polega na użyciu 'Application.Run', jeśli posiadasz moduł i' CallByName', jeśli posiadasz obiekt klasy. Niestety nie są wymienne! W szczególności obsługa błędów jest inna. Jeśli ktoś zgłosi błąd w kodzie wywoływanym przez 'Application.Run', nie mogę go złapać w mojej procedurze, ale' CallByName' pozwala mi go złapać. Czy istnieje jakieś obejście? –

0

Niestety nie jest możliwe wcześniejsze dodanie ProjectName przed ModuleName i dodanie kolejnego okresu "." W MS Word powoduje to błąd runtime 438. Połączenie jest ograniczone do używania po prostu ModuleName.ProcName.

1

Moduły w VB6 i VBA są czymś w rodzaju klas statycznych, ale niestety VB nie akceptuje Module1 jako obiektu. Możesz napisać Module1.Func1 jak C.Func1 (C jest instancją klasy Class1), ale oczywiście robi to kompilator, a nie runtime.

Pomysł: Konwertuj moduł1 na klasę, Utwórz "Moduł publiczny1 jako Moduł1" w module rozruchowym i "Ustaw moduł1 = Nowy moduł1" w "Podrzędnym głównym".

Powiązane problemy