函数参数VBA

我有这三个function:

当我运行前两个函数时,没有任何问题,但是当我运行最后一个函数(LMTD)时,它表示'除以零',但是当我debugging一些参数有值时,有些不会。 我知道我必须做什么,但我想知道为什么我必须这样做,因为这对我没有意义。

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 

我将尝试给出一个有用的和完整的解释如何通过参数:

据我所知,LMTD是调用其他函数的主要函数。 每次调用一个新函数时,它都被放在他们所谓的“堆栈”之上。
Stack的原理涉及到内存的一端(堆栈顶部)分配和解除分配内存:内存分配给在堆栈顶部的函数中声明和使用的局部variables(被调用的函数放入作用域并在堆栈顶部形成一个新层),而这些局部variables只要函数超出范围(当返回值时)就会被释放。 通常被称为“后进先出”(LIFO)的东西。
所以如果你考虑LMTD的基础(这可能不是最终的基础,因为它必须由另一个子例程或函数调用),Tinn和Tut被放置在堆栈的顶部,每当这些函数被调用。

然而(这里是重点),
在函数中没有本地声明并且作为parameter passing的variables是由Reference传递的标准variables,它们是指针variables,包含由堆栈下层的函数(或子)发送的参数的内存地址。 当一个函数通过引用(默认)获取参数时,它可以改变传递的内存地址中包含的值,因此当返回被调用的函数时,原来的variables值可以被改变。

这个例子说明了它:

 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关键字)发送variables,则这意味着将创build原始variables(作为parameter passing)的副本,并且原始variables保持原样,而在函数中操作副本。 换句话说,这个副本将成为堆栈顶部的局部variables,并在函数超出范围时立即释放。

因此,如果不深入深入地研究代码,当您在一个例程中调用多个函数时,可能会帮助您牢记不同层次的一般概念。 为了关注本地variables,可以使用VBA中的“locals”窗口进行后续操作,或者使用debug.print来跟进即时窗口。 什么可以帮助你获得有关错误更多的透明度是通过执行检查。 例如Tinn函数:

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

如果我的解释超出预期,我很抱歉,但是我试图尽可能地完善这个。