-1

我正在尝试在 VBA 上取得一些进展

我知道这是非常基本的,但在工作表事件中,例如更改

Private Sub Worksheet_Change(ByVal Target as Range) 
    Target.Font.ColorIndex = 5 
End Sub

我已经在此链接中搜索了 ByVal 的含义

我无法从帮助中的这个解释中得到意义

指定以这样一种方式传递参数,即被调用的过程或属性不能更改调用代码中参数基础的变量的值。

女巫真的把我搞糊涂了……

我还在各种来源中进行了搜索,发现了这种不同的解释,使我更深地陷入了黑暗……它是这样的:

如果您不希望被调用过程修改作为参数传递的任何变量,则可以修改被调用过程的参数列表,以便通过值而不是通过引用将参数传递给它。为此,请在参数前面加上 ByVal 关键字。这种技术使被调用的例程使用传递的变量数据的副本——而不是数据本身。

他的意思是“参数是通过值而不是通过引用传递给它的”?你能用简单的方式解释一下 ByVal 的作用吗?我在编写代码时经常使用它,并且我想知道我正在编写的每一段代码。

4

1 回答 1

3

这是一个非常好的网站,其中的示例解释了价值和参考之间的区别: http : //www.physics.nyu.edu/grierlab/idl_html_help/procedures12.html 如果有帮助,请告诉我!如果没有,我可以更深入地解释它,但我认为该网站充分涵盖了该主题。

编辑:

按值表示它已设置。您不能在另一个函数中再次调用此值。通过引用意味着可以再次调用该值。所以在这个例子中,PRO ADD, A, BA = A + B RETURN END

A 通过引用传递,因为用户再次调用 A,并返回它。但是,B 是按值调用的。在以下示例中,ADD, A, 4 有效。A 定义为 A = A + B。所以用户再次调用 A,并将 B 添加到它。但是,ADD, 4, A 不起作用,因为 4 是一个值。所以 4 = A + B 会产生错误。当然,这也可以应用于 VBA。

补充一点,这种区别之所以重要,主要有两个方面:

保护:在两种传递机制之间进行选择时,最重要的标准是保护变量免受意外更改。调用 ByRef 时,过程可以通过该参数向调用代码返回一个值。换句话说,它可以再次引用同一个变量。ByVal 保护变量不被过程更改。因此,例如,如果您无论如何都希望变量 = 4,则可以使用 ByVal。

性能:传递机制会影响性能,但通常无关紧要。一个例外是通过 ByVal 传递的值类型。在这种情况下,Visual Basic 复制参数的整个数据内容。因此,对于结构体这样的大值类型,通过 ByRef 传递会更有效率。

对不起,答案很长,希望对您有所帮助。

于 2014-01-28T21:58:01.200 回答