ByVal vs ByRef VBA

Mal*_*red 5 excel vba excel-vba

我试图尝试JaredPar ByRef和ByVal Clarification所回答的问题

ByVal在VB.NET中意味着将提供的值的副本发送到该函数.对于值类型(Integer,Single等),这将提供值的浅表副本.对于较大的类型,这可能是低效的.对于引用类型(String,类实例),传递引用的副本.因为副本通过突变传递给参数,=所以调用函数不会看到它.

ByRef在VB.NET中意味着对原始值的引用将被发送到函数(1).它几乎就像在函数中直接使用原始值.类似的操作=会影响原始值并在调用函数中立即可见.

我试着用以下代码测试它,我似乎无法让它工作使用ByRef更改单元格的值,0如果它是1

这是我正在测试的下面的代码,我做错了什么?价值Range("A1")仍然是1

Sub test1()

    Dim trythis As Boolean

    trythis = False

    If (Sheets("TESTING").Range("A1").value = 1) Then
        testingRoutine (trythis)
        If (trythis) Then
            Debug.Print "Value changed to 0"
            Sheets("TESTING").Range("A1").value = 0
        End If
    End If

End Sub

Private Function testingRoutine(ByRef trythis As Boolean)

    Debug.Print "Ran Function"
    trythis = True

End Function
Run Code Online (Sandbox Code Playgroud)

Pau*_*vie 7

VB子例程不需要在参数列表周围使用大括号.但是,如果您传递一个参数并将其括在大括号中,则表示您正在传递一个表达式.表达式不能通过引用传递.因此,您必须删除调用中的大括号testingRoutine (trythis)并写入testingRoutine trythis

注意:如果在不使用其返回值的情况下调用函数,则必须将其写为过程调用(参数列表周围没有大括号).

  • 有一种误解,OP的`testingRoutine`不是sub,而是一个函数. (2认同)