2010-04-22 459 views
6

使用CallByName在類模塊內調用函數很容易 標準模塊內部的函數如何?使用VB/VBA中的「CallByName」調用模塊中包含的子或函數

''#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

你不能。查找'Application.Run',它可以在標準模塊中使用例程。 – jtolle 2010-04-23 00:15:30

+0

由於你的'函數'不是重新調整值,你應該使用'Sub'而不是'Function'。 'Call'從不需要,你可以直接寫'CallByName clsObj,「ClassFunc1」'。要調用一個標準模塊中的功能FUNC1就是這麼簡單'Func1' - 使用合適的限定在聲明中如果需要的話 – barrowc 2010-04-23 05:57:35

回答

2

CallByName只與類對象的作品。

如果你的子程序是一個標準模塊中,你可以這樣做:

Sub Main() 
    Module1.Func1 
End Sub 

如果它是一個功能,那麼你可能想捕捉的返回值;這樣的事情:

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

我認爲jtolle的迴應解決了最好的問題 - 對Application.Run的小引用可能是答案。提問者並不想用簡單的FUNC1或Module1.func1 - 一個想在第一時間使用CallByName的原因是期望function.sub名在編譯時不知道。在這種情況下,Application.Run做的工作,例如:

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

您也可以預先設置項目名稱的模塊名前添加一個句號「」。 不幸的是,Application.Run不會返回任何值,因此,儘管你可以調用一個函數,你不會得到它的返回值。

+3

這是令人沮喪的變化範圍。顯然互聯網的智慧是,如果你有一個模塊,就使用'Application.Run',如果你有一個類對象,則使用'CallByName'。不幸的是,它們不可互換!錯誤處理尤其不同。如果有人在'Application.Run'調用的代碼中引發錯誤,我無法在我的過程中捕獲它,但'CallByName'確實讓我抓住它。有什麼解決方法嗎? – 2013-09-16 16:46:35

0

不幸的是,不可能在ModuleName之前加上ProjectName,並添加另一個句點「。」。在MS Word中,這會引發運行時錯誤438.該調用僅限於使用ModuleName.ProcName

1

模塊在VB6和VBA是像靜態類,但不幸的是VB不接受模塊1作爲對象。您可以像C.Func1一樣編寫Module1.Func1(C是一些Class1的實例),但這顯然是由編譯器完成的,而不是在運行時完成的。

理念:轉換模塊1的一類,創建啓動模塊在「公共模塊1爲模塊」和「設置模塊1 =新模塊1」在「子主」。

相關問題