为什么更改和选择更改事件使用byval

  • 本文关键字:byval 事件 选择 excel vba
  • 更新时间 :
  • 英文 :

Private Sub Worksheet_Change(ByVal Target As Range)
End Sub

在互联网上,byRef和byVal的区别在于byRef指向一个引用,byVal创建一个新的引用并复制原始引用的值。因此,当您更改传递的变量时,它不会影响原始变量。

但是,如果这是准确的,为什么工作表事件(如change和selection_change(被Val使用。这难道不意味着代码不应该能够操作所选范围的值吗。毕竟byVal应该不能只更改它创建的副本的原始值。然而,如果你写一些类似的东西

Private Sub Worksheet_Change(ByVal Target As Range)
Target.Font.Color = VBA.ColorConstants.vbBlue
End Sub

在选定范围内写入的任何内容实际上都会更改其颜色。那么,这里到底发生了什么?

  1. 您必须知道ByVal仍然传递引用。即使您获得了引用对象的副本。

  2. 在名为ByVal的过程/事件内部,可以使用引用的对象并更改其属性。这样一个简单的事件,基于我在第一项中所说的内容:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Interior.Color = vbYellow
End Sub

实际上,您使用相同的对象实例(在内存中(。仅复制引用。您可以在名为ByVal的子中使用它。

  1. 当您使用自定义变量并期望以某种方式(或不(影响初始变量值时,变量的行为就像您试图声明的那样,但在调用其他处理它的子系统后会影响初始变量的值

请看下一个例子,看看在两个不同的处理子系统的情况下初始变量是如何变化的:

Sub testByValSub()
Dim x As String
x = "myString"
Debug.Print x

changeStrBV x
Debug.Print "After ByVal: " & x

changeStrBR x
Debug.Print "After ByRef: " & x
End Sub
Sub changeStrBV(ByVal x)
x = x & " and something else"
'do whatever you want with x, but only here...
End Sub
Sub changeStrBR(ByRef x)
x = x & " and something else"
End Sub

最新更新