2010-02-05 86 views
3

我試圖實例化一個對象並將其從函數中返回。我正在使用的課程是我創建的課程。但是,當我嘗試設置一個對象,從函數返回時,我得到一個錯誤。我究竟做錯了什麼?從VBA中的函數返回對象實例時出錯

Function CreateBlah(NAME As String, Count As Integer, val As String) As Blah 
    Dim b As Blah 
    Set b = New Blah 
    bkmrk.Initialize NAME, Count, val 
    MsgBox (bkmrk.NAME) 
    CreateBlah = bkmrk 
End Function 
中其他功能

則...

Dim bmrk As Blah 
Set bmrk = CreateBlah("Test", 1, Trim(AString)) 

我也試過......

Dim bmrk As Object 
Set bmrk = CreateBlah("Test", 1, Trim(AString)) 

我是新來的VBA,任何人都可以告訴我,我什麼做錯了?

+0

這個問題是非常糟糕的措辭,因爲你忽略了你的真實數據類型。雖然由於.Initialize,它看起來像是一個獨立的類模塊,不清楚你處理的是什麼類型的「對象」。包括這些信息會提高你的答案。也就是說,這很明顯,正如@AdamRalph在下面指出的那樣,函數的最後一行應該是「Set CreateBlah = bkmrk」。這可能不是導致你的問題的原因,但是它是你發佈的代碼中的一個缺陷(可能與你的原始代碼接近也可能不接近)。 – 2010-02-06 01:45:16

+0

給我們一些關於這個錯誤的細節,你會得到什麼? – 2010-02-07 00:09:49

回答

2

我認爲

Dim b As Blah 
Set b = New Blah 

實際上應

Dim bkmrk As Blah 
Set bkmrk = New Blah 

如果是這樣,你錯過了一組關鍵字。

Set CreateBlah = bkmrk 

一旦修正這個那麼你的消費代碼兩個版本應該工作,雖然前者是更好,因爲你是強類型的變量。

9

你需要使用設置一次分配的對象。這意味着設置返回值時以及將返回值分配給變量時。 後期綁定示例:

Public Sub Example() 
    Dim objWrd As Object 
    Set objWrd = GetWord 
    objWrd.Visible = True 
    objWrd.Quit 
End Sub 

Public Function GetWord() As Object 
    Set GetWord = CreateObject("Word.Application") 
End Function 

早期綁定示例:

Public Sub Example() 
    ''//Requires reference to Microsoft Office Word 
    ''//(Tools>References) 
    Dim objWrd As Word.Application 
    Set objWrd = GetWord 
    objWrd.Visible = True 
    objWrd.Quit 
End Sub 

Public Function GetWord() As Word.Application 
    Set GetWord = New Word.Application 
End Function 
+0

在Sub Example()中,您應該有以下語句:在objWrd.Quit語句後面設置objWrd = nothing以防止內存泄漏。 – 2012-05-17 02:23:16

+1

@JayHaase,我不確定VB,但沒有必要在其他PL中將其設置爲「無」。這是一個局部變量(或稱它爲指針或引用更好),並在子例程結束時自動銷燬。 – meir 2012-05-25 11:46:36

+0

@Meir,根據我的理解,將參考設置爲Nothing將加速垃圾收集過程,這對於記錄集等昂貴資源非常重要。請參考此問題:http://stackoverflow.com/questions/517006/is-there-a-need-to-set-objects-to-nothing-inside-vba-functions – 2012-05-25 21:03:20