2010-04-22 7 views
6

Es ist einfach, eine Funktion in einem classModule mit CallByName aufzurufen Wie wäre es mit Funktionen innerhalb des Standardmoduls?Aufruf eines Subs oder einer Funktion in einem Modul mit "CallByName" in 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

Sie können nicht. Suchen Sie nach 'Application.Run', das mit Routinen in Standardmodulen funktioniert. – jtolle

+0

Da Ihre "Funktionen" keine Werte neu abstimmen, sollten Sie "Sub" anstelle von "Function" verwenden. 'Call' wird nie benötigt, Sie könnten einfach' CallByName clsObj, 'ClassFunc1 '' schreiben. Um Func1 innerhalb eines Standardmoduls aufzurufen, ist Func1 so einfach wie 'Func1' - verwenden Sie entsprechende Modifikatoren in der Deklaration, um den Bereich bei Bedarf zu ändern. – barrowc

Antwort

2

CallByName funktioniert nur mit Klassenobjekten.

Wenn Ihr Unterprogramm in einem Standardmodul ist, können Sie dies tun:

Sub Main() 
    Module1.Func1 
End Sub 

Wenn es eine Funktion ist, dann werden Sie wahrscheinlich den Rückgabewert erfassen möchten; so etwas wie diese:

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

Ich denke jtolle Antwort auf die Frage am besten angegangen - der kleine Bezug auf Application.Run die Antwort sein kann. Der Fragesteller möchte nicht einfach func1 oder Module1.func1 verwenden - der Grund, warum CallByName überhaupt verwendet werden soll, ist, dass der gewünschte function_name zur Kompilierzeit nicht bekannt ist. In diesem Fall tut Application.Run Arbeit, z.B .:

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

Sie auch den Projektnamen vor dem Module prepend und fügen Sie einen anderen Punkt „“. Leider gibt Application.Run keine Werte zurück, so dass Sie zwar eine Funktion aufrufen können, aber nicht den Rückgabewert erhalten.

+3

Das ist frustrierend. Anscheinend ist die Internet-Weisheit, 'Application.Run' zu verwenden, wenn Sie ein Modul haben, und' CallByName', wenn Sie ein Klassenobjekt haben. Leider sind sie nicht austauschbar! Die Fehlerbehandlung ist insbesondere anders. Wenn jemand einen Fehler in dem von'Application.Run' aufgerufenen Code auslöst, kann ich ihn in meiner Prozedur nicht abfangen, aber 'CallByName' lässt mich abfangen. Gibt es eine Problemumgehung? –

0

Leider ist es nicht möglich, die ProjectName vor der ModuleName voranzustellen und einen weiteren Punkt hinzuzufügen "." In MS Word löst dies einen Laufzeitfehler 438 aus. Der Aufruf ist auf die Verwendung von einfach ModuleName.ProcName beschränkt.

1

Module in VB6 und VBA sind so etwas wie statische Klassen, aber leider akzeptiert VB Module1 nicht als Objekt. Sie können Module1.Func1 wie C.Func1 schreiben (C ist eine Instanz einer Klasse1), aber dies wird offensichtlich vom Compiler ausgeführt, nicht zur Laufzeit.

Idee: Konvertieren Sie das Module1 in eine Klasse, erstellen Sie ein "Public Module1 als Module1" in Ihrem Startup-Modul und "Set Module1 = New Module1" in Ihrem "Sub Main".

Verwandte Themen