首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel事件处理程序中的ByVal

Excel事件处理程序中的ByVal
EN

Stack Overflow用户
提问于 2019-07-26 17:26:02
回答 2查看 157关注 0票数 0

对于ByVal关键字在Excel中的某些事件处理程序中的用法,我有点困惑。

NewSheet事件示例(复制自Excel2019Power Programming with,Wiley)

代码语言:javascript
复制
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中可能有一些特性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-26 17:30:16

由于要传递对象,ByVal传递引用的副本(值)。引用的副本(值)仍然指向原始引用所指向的内容。因此,您的方法可以工作并更改原始引用所指向的内容。

如果您了解Java,这在本质上类似于Java,在Java中,一切都可以说是“按值传递”,但是当您将一个对象作为参数传递时,您实际上要做的是传递引用的副本,而不是引用所指向的引用的副本。

票数 3
EN

Stack Overflow用户

发布于 2019-07-26 17:36:20

在这些情况下,ByVal阻止了原始引用本身中的值的更改。

请参阅下一页:

代码语言:javascript
复制
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 Module
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57224591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档