Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 函数参数VBA_Excel_Function_Vba_Arguments - Fatal编程技术网

Excel 函数参数VBA

Excel 函数参数VBA,excel,function,vba,arguments,Excel,Function,Vba,Arguments,我有三个功能: 当我运行前两个函数时,没有问题,但当我运行最后一个函数(LMTD)时,它会显示“零除”,然而当我调试一些参数时,有些参数有值,有些没有值。我知道我必须做什么,但我想知道为什么我必须这样做,因为这对我来说毫无意义 Tinn函数没有Tut的参数,所以我必须将它们添加到Tinn函数的参数中。图坦卡蒙也是如此,他不知道蒂恩的所有论点,LMTD必须同时拥有蒂恩和图坦卡蒙的论点。如果我这样做,一切都会顺利进行。我为什么要这么做 Public Function Tinn(Tw, Qw, Qp,

我有三个功能:

当我运行前两个函数时,没有问题,但当我运行最后一个函数(LMTD)时,它会显示“零除”,然而当我调试一些参数时,有些参数有值,有些没有值。我知道我必须做什么,但我想知道为什么我必须这样做,因为这对我来说毫无意义

Tinn函数没有Tut的参数,所以我必须将它们添加到Tinn函数的参数中。图坦卡蒙也是如此,他不知道蒂恩的所有论点,LMTD必须同时拥有蒂恩和图坦卡蒙的论点。如果我这样做,一切都会顺利进行。我为什么要这么做

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

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

End Function



我将尝试就参数是如何传递的给出一个有用且完整的解释:

据我所知,LMTD是调用另一个函数的主要函数。 每次调用一个新函数时,它都被放在他们所称的“堆栈”之上
堆栈的原理是在内存的一端(堆栈顶部)分配和释放内存:内存分配给堆栈顶部函数中声明和使用的那些局部变量(称为get in scope并在堆栈顶部形成一个新层的函数)当函数超出范围时(返回值时),这些局部变量就会被释放。通常被称为“后进先出”(后进先出)的东西。
因此,如果考虑LMTD基点(这可能不是最终基数,因为它必须由另一个子例程或函数调用),每当调用这些函数时,Tinn和TUT被放置在堆栈的顶部。p> 然而(这里是要点),
未在函数中局部声明并作为参数传递的变量是标准的引用传递变量,它们是指针变量,包含堆栈底层上函数(或子函数)发送的参数的内存地址。 当函数通过引用获取参数(默认值)时,它可以更改传递的内存地址所包含的值,因此在返回被调用函数时可以更改原始变量值

这个例子说明了这一点:

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中的“局部变量”窗口进行后续操作,或使用debug.print在即时窗口中进行后续操作。 通过执行检查,可以帮助您获得有关错误的更多透明度。例如 对于Tinn功能:

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

如果我的解释超出了你的预期,我很抱歉,但我在这一点上尽可能完整

这些函数在做什么?参数可能不是零,但有几个划分。它们所做的并不那么重要。基本上我想知道的是,为什么一个调用另一个函数的函数需要第二个函数的参数+它自己的参数才能正常工作?在
LMTD
函数中声明的
Tw
Qw
Qp
Q
deltaT
f
mix
在哪里?如果它们不是全局的,那么它们不会在任何地方声明,因此它们没有任何值。Miscrosoft quote:通过引用传递的危险在于,您可能无意中允许另一个过程修改已传递的值。为了防止这种情况发生,可以按值传递参数,或者使用临时变量存储参数,然后修改临时变量。这实际上帮助很大!非常感谢。
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
If QP = 0 then 
    'Notify problem at QP. 
end if