对于ByVal关键字在Excel中的某些事件处理程序中的用法,我有点困惑。
NewSheet事件示例(复制自Excel2019Power Programming with,Wiley)
Private Sub Workbook_NewSheet(ByVal Sh As Object)
If TypeName(Sh) = "Worksheet" Then
Sh.Cells.ColumnWidth = 35
Sh.Range("A1") = "Sheet added " & Now()
End If
End Sub这段代码可以像预期的那样工作,看起来很琐碎。但经过一些思考,我越来越困惑了。
根据我的理解,ByVal意味着Sh只是原始工作表对象的副本,使用ByVal参数的过程不会导致对原始对象的更改。换句话说,代码所做的应该没有任何效果。
只有当引用传递给过程时,它们才能修改这些引用所引用的对象。
我是不是漏掉了什么?谢谢
我对通过引用/值传递的大部分理解来自于其他编程语言,如C#。在我不知道的VBA中可能有一些特性。
发布于 2019-07-26 17:30:16
由于要传递对象,ByVal传递引用的副本(值)。引用的副本(值)仍然指向原始引用所指向的内容。因此,您的方法可以工作并更改原始引用所指向的内容。
如果您了解Java,这在本质上类似于Java,在Java中,一切都可以说是“按值传递”,但是当您将一个对象作为参数传递时,您实际上要做的是传递引用的副本,而不是引用所指向的引用的副本。
发布于 2019-07-26 17:36:20
在这些情况下,ByVal阻止了原始引用本身中的值的更改。
请参阅下一页:
Module Module1
Sub Main()
' Declare an instance of the class and assign a value to its field.
Dim c1 As New Class1()
c1.Field = 5
Console.WriteLine(c1.Field)
' Output: 5
' ByVal does not prevent changing the value of a field or property.
ChangeFieldValue(c1)
Console.WriteLine(c1.Field)
' Output: 500
' ByVal does prevent changing the value of c1 itself.
ChangeClassReference(c1)
Console.WriteLine(c1.Field)
' Output: 500
Console.ReadKey()
End Sub
Public Sub ChangeFieldValue(ByVal cls As Class1)
cls.Field = 500
End Sub
Public Sub ChangeClassReference(ByVal cls As Class1)
cls = New Class1()
cls.Field = 1000
End Sub
Public Class Class1
Public Field As Integer
End Class
End Modulehttps://stackoverflow.com/questions/57224591
复制相似问题