2012-02-05 19 views
1

我已經創建了一個類模塊,我在其中定義了一個函數。無論何時調用該函數,它都會在本地窗口中列出兩次。只有第二個值的變化,第一個值根據其類型保持爲空或「零」,直到代碼執行結束。我在標準模塊中定義的函數沒有這個問題。我做錯了什麼,這是一個錯誤,還是有這背後的邏輯原因?爲什麼我的函數名在「locals」窗口中出現兩次?

所述的TestClass類模塊的內容:標準模塊的

Public Value As Double 

Function AddFive() As Double 
    AddFive = Me.Value + 5 
End Function 

內容:

Sub TestSub() 
    Dim TestObject As New TestClass 
    TestObject.Value = 2 
    MsgBox TestObject.AddFive 
End Sub 

下面是一個屏幕截圖示出了,當執行該代碼行由在函數的代碼執行後,函數的值在本地窗口中列出兩次,並且只有第二個值已經更改。

(link to screenshot)

我使用VBA的Excel 2010中

在此先感謝。

+0

請發表您的代碼。 – brettdj 2012-02-05 02:52:48

+1

VBA函數中有一個與函數名稱相同的隱式變量。你在你的片段中分配的那個。變化的是隱式變量,不是實際函數的返回值,只有在退出函數後才進行計算。 – 2012-02-05 16:36:56

+0

如果函數是在標準模塊中定義的,則函數的返回值不會出現在本地窗口中。爲什麼只有隱含變量出現? – Cutter 2012-02-05 16:46:44

回答

0

這個問題更多的是你如何做。如果你有一個函數只是將5添加到一個類對象的內部變量中,那麼它在技術上就是一個void(VBA中的Sub),因爲你不需要返回值。

你的代碼應該是:

CLASS

Public Value As Double 

Sub AddFive() 
    Me.Value = Me.Value + 5 
End Sub 

MODULE

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 
testObject.AddFive 

MsgBox testObject.Value 

End Sub 

我可以想像可能有多種原因有創建2個變量的原因,但是我覺得自從你這麼做以後,爲什麼會出現意想不到的行爲是沒有意義的e做錯誤的代碼。

如果你願意,你甚至可以編寫類函數,它會在msgbox中顯示它的值爲+ 5,這也不會創建額外的變量。但這很奇怪,我想你想要上面的代碼。但在這裏它是不分:

CLASS

Public Value As Double 

Sub ShowPlusFive() 
    MsgBox Me.Value + 5 
End Sub 

MODULE

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 

testObject.ShowPlusFive 

End Sub 
+0

爲了簡單起見,我選擇了這個例子。我不想避免創建第二個變量,我試圖理解爲什麼創建它。 – Cutter 2012-02-07 11:34:28

+0

我的猜測是VBA在模塊中使用了一個變量(MsgBox需要返回一些變量),並且類函數還創建了一個返回值(最終傳遞給模塊中的MsgBox的那個)。在你的類函數中傳遞返回值之前,最可能是0的模塊之一。這只是一個猜測,而且這個例子有點時髦,因爲你通常不會在msgbox調用中使用帶有返回值的函數。 – aevanko 2012-02-07 16:07:07

+0

我想象一下msgbox在碰到MsgBox行時隱式創建變量,因爲它知道它需要某處到temp。存儲返回值,並且類函數將創建它自己的返回值變量,因爲它應該與類成員關聯(它不會只是捎帶並使用由主模塊中的MsgBox調用創建的temp變量) 。這就可以解釋爲什麼你不在普通模塊中這種行爲(類成員函數可能是這樣設置的)。 – aevanko 2012-02-07 16:10:08

相關問題