2015-11-19 27 views
1

在以下代碼中,測試1,2和3編譯,但測試3在運行時失敗,「對象不支持此屬性或方法」: (爲什麼?)不帶關鍵字「調用」的用戶定義類的調用方法

Sub testdrive() 

    Dim sh As Worksheet 
    Dim val As Single 
    Dim myfoo As New CFoo 

    ' test 1 
    val = 4 
    myfoo.sub1 (val) 

    ' test 2 
    Set sh = ThisWorkbook.Sheets(1) 
    Call myfoo.sub2(sh) 

    ' test 3 
    myfoo.sub2 (sh) 

End Sub 

類模塊只包含以下內容:

Public f As Single 

Public Sub sub2(sh As Worksheet) 

End Sub 

Public Sub sub1(s As Single) 

End Sub 

我無法找到當我不得不使用關鍵詞「call」的明確聲明。

有人可以啓發我嗎?

+0

它失敗的地方在哪裏?什麼線? –

+0

關於通話的錯誤信息是什麼? –

+1

你試過刪除'()'嗎? – findwindow

回答

1

當你加上括號參數不使用關鍵字Call,在VBA語法,這意味着要強制評估它,然後通過其價值。對於VBA,實現此目的的唯一方法是對參數進行評估,然後將其值傳遞給子例程

如果參數是一個簡單類型,如Single,那麼它適用於Public Sub sub1(s As Single),那麼sub1(something)就可以正常工作。

但是當參數是一個工作表,如Public Sub sub2(sh As Worksheet),調用sub2(sh)用括號時,你問VBA來評估工作表,它不知道如何實現。基本上,Worksheet不是VBA可以評估的對象。因此,它說

此對象不具有該屬性或方法

這意味着:類Worksheet不具有默認屬性.Value,這在另一方面例如,對於Range對象存在。

除非使用關鍵字Call,否則無法對工作表參數加括號,這會阻止其事先評估。

Call myfoo.sub2(sh) '<~~ works fine 
myfoo.sub2 sh '<~~ works fine 
myfoo.sub2(sh) '<~~ problem, you are asking VBA to evaluate sh and pass its value 

最後,請注意,這與您的Subs是類方法的事實無關。如果它們是普通的子程序,放置在一個普通的代碼模塊中,它本來是一樣的。

+0

Thx ASH欣賞精心製作。現在晶瑩剔透! – foobar

相關問題