2017-06-01 63 views
1

在VBA中,您可以可以對待UDF名稱,就像Dim med變量一樣。例如,使用函數名稱作爲變量時的注意事項

Function ADD(a, b) As Long 
ADD = a 
ADD = ADD + b 
End Function 

其中ADD存儲中間值以及最終結果。我的問題是;在這是怎麼回事幕後而言,有存儲號碼/件數據的標準可變VS函數名變量之間的任何差別。


我擔心,只要變量的變化,如果你使用的函數名,而不是僅在執行End Function也許是調用該函數的程序得到更新。 IE瀏覽器。如果你有一些代碼

answer = ADD(1, 2) 

然後在內存answer被寫入兩次,一次是當ADD = a,一旦當ADD = ADD + b。當然,我們沒有看到這一點,因爲答案是留下任何最終ADD

我問,因爲我經常發現我建立使用一箇中間變量階段的函數的答案,然後傳遞給函數名本身,而是我可以直接寫入函數名稱。

E.g.

Function ADD(a, b) As Long 
Dim tot As Long 
tot = a 
tot = tot + b 
ADD = tot 
End Function 

vs第一個例子。他們acheive同樣的事情,在第二個例子中tot表示式的結果,所以我們需要在年底最後ADD = tot線。對於速度,我想,以減少所做的任何寫操作,那麼有沒有在速度方面的任何缺點,沒有可讀性使用第一種方法,而不是宣佈中間體?

NB,澄清,這還不是全部的中間體,我只是意味着代表函數結果,並可以通過在代碼的函數名來代替單一的中間。

+0

@CallumDA,爲什麼標籤編輯 - 我不認爲這一定是做Excel中,它只是爲了吸引正確的類的關注呢? – Greedo

+0

是的,如果你不同意,隨時刪除它們。 – CallumDA

+0

嗯,我已經找到了一個考慮因素;如果該函數返回一個數組,然後試圖設置該數組的一個元素看起來就像試圖調用該函數一樣! VBA不喜歡那個 – Greedo

回答

2

在速度上的第一個方法應該更快略 - 你聲明一個變量少(但我懷疑有人能注意到它)。

在一般情況下,使用第一種方法能帶給你一個遞歸,如果你不小心(或者,如果你是一個VBA初學者):

Option Explicit 

Dim lng10 As Long 

Public Sub Test() 

    lng10 = 0 
    Debug.Print ADD2(1, 1) 

End Sub 

Function ADD2(a As Long, b As Long) As Long 

    lng10 = lng10 + 1 
    ADD2 = a + b 

    If lng10 < 10 Then 
     ADD2 = ADD2 + ADD2(1, 1) 
    End If 

End Function 

如果遞歸沒有底,它會發生溢出錯誤。 與其他詞,這將是一個運行時錯誤:

Option Explicit 

Dim lng10 As Long 

Public Sub Test() 

    lng10 = 0 
    Debug.Print ADD2(1, 1) 

End Sub 

Function ADD2(a As Long, b As Long) As Long 

    lng10 = lng10 + 1 
    ADD2 = ADD2(a, b) 

End Function 
+0

通過第一個調試看起來很奇怪 – Greedo

+1

@Greedo - 2.一個拋出錯誤。 – Vityata

+0

@Greedo - 關於代碼的第一部分,它很奇怪/怪異,因爲遞歸函數的結果保存在一個堆棧中,最後它們被用於計算。如果您將代碼「翻譯」爲C#,則在Visual Studio中,這將在「調用堆棧」中可見。 – Vityata