2012-07-05 66 views
2

我有三個功能:函數的參數VBA

當我運行前2個功能,有沒有問題,但是當我運行的最後一個函數(LMTD),它是由零部「說,然而,當我調試一些論據有價值,有些則沒有。我知道我必須做什麼,但我想知道爲什麼我必須這樣做,因爲這對我沒有意義。

Tinn函數沒有Tut的參數,所以我必須將它們添加到Tinn函數的參數中。 Tut也是如此,他不知道Tinn的所有論點,LMTD必須同時具備Tinn和Tut的論點。如果我這樣做,這一切都會順利進行。爲什麼我必須這樣做?

Public Function Tinn(Tw, Qw, Qp, Q, deltaT) 

Tinn = (((Tw * Qw) + (Tut(Q, fd, mix) * Q))/Qp) + deltaT 

End Function 

Public Function Tut(Q, fd, mix) 

Tut = Tinn(Tw, Qw, Qp, Q, deltaT) _ 
    - (avgittEffektAiUiLMTD()/((Q * fd * mix)/3600)) 

End Function 

Public Function LMTD(Tsjo) 

LMTD = ((Tinn(Tw, Qw, Qp, Q, deltaT) - Tsjo) - (Tut(Q, fd, mix) - Tsjo)) _ 
    /(WorksheetFunction.Ln((Tinn(Tw, Qw, Qp, Q, deltaT) - Tsjo) _ 
    /(Tut(Q, fd, mix) - Tsjo))) 

End Function 
+0

這些功能在做什麼?論點可能不是零,但有幾個部門。 – dreamlax

+0

他們所做的並不是那麼重要。我基本想知道的是,爲什麼一個調用另一個函數的函數需要第二個函數+它自己的參數才能正常工作? –

+2

「LMTD」函數中聲明的「Tw」,「Qw」,「Qp」,「Q」,「deltaT」,「f」,「mix」如果它們不是全球性的,那麼它們就不會在任何地方宣佈,所以它們沒有任何價值。 – dreamlax

回答

4

我會努力就如何參數正在傳遞一個有用的和完整的解釋:

據我所知,LMTD是主函數調用其他函數。每次調用一個新函數時,它都放在他們稱之爲「棧」的頂部。
Stack的原理涉及在內存的一端(堆棧頂部)分配和解除分配內存:內存分配給在堆棧頂部的函數中聲明和使用的局部變量(函數稱爲gets在範圍內並在堆棧頂部形成一個新層),而只要函數超出範圍(當返回值時),這些局部變量就會被釋放。通常被稱爲「後進先出」(LIFO)的東西。
所以如果你考慮LMTD的基礎(這可能不是最終的基礎,因爲它必須由另一個子例程或函數調用),Tinn和Tut被放置在堆棧的頂部,只要這些函數被調用。

然而(這裏是點),
變量不是在功能局部聲明和作爲參數通過參考標準傳遞通過,它們是含有由函數(或子)發送來的參數的存儲器地址指針變量在堆棧的下層。 當函數通過引用(默認值)引用參數時,它可以更改傳遞的內存地址中包含的值,因此當返回被調用的函數時,可以更改原始變量值。

這個例子說明吧:

Sub Base_Sub() 

Dim i as single 
Dim c as single 
Dim d as single 

c = 5 
d = 6 

i = Function_1(c, d) 

End Sub 

Function Function_1(c, d) 

c = 7 'Notice that the variables c and d are also changed in the Base_sub 
d = 5 

Function_1 = c + d 

End Function 

相反,如果你想通過值(ByVal關鍵字)發送變量,這將意味着原始變量的副本(即作爲參數傳遞)是並且在函數中操作副本時原始變量保持不變。換句話說,這個副本將成爲堆棧頂部的局部變量,並在函數超出範圍後立即釋放。因此,如果不深入深入地研究代碼,當您在一個例程中調用多個函數時,它可以幫助您牢記不同層次的這個一般概念。 爲了關注本地變量,可以使用VBA中的「locals」窗口進行後續操作,或者使用debug.print在後續窗口中進行跟蹤。 什麼可以幫助您獲得有關錯誤的更多透明度是通過執行檢查。例如 的蒂恩功能:

If QP = 0 then 
    'Notify problem at QP. 
end if 

我很抱歉,如果我的解釋是比你預期的多,但我試圖儘可能完整的就這一個。

+0

Miscrosoft報價:通過引用傳遞的危險在於,您可能無意中允許其他過程修改已通過它的值。爲防止發生這種情況,可以通過值傳遞參數或使用臨時變量來存儲參數,然後修改臨時變量。 – Trace

+0

這實際上幫了很多!謝謝! –

+0

不客氣! – Trace