ByVal vs ByRef VBA

时间:2017-10-26 17:00:51

标签: excel vba excel-vba

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

  VB.NET中的

ByVal表示将发送所提供值的副本   到功能。对于值类型(IntegerSingle等),这将是   提供值的浅表副本。对于更大的类型,这可以   效率低下。但是对于参考类型(String,类实例)a   传递的副本被传递。因为副本是通过突变传递的   通过=参数,它不会对调用函数可见。

     VB.NET中的

ByRef表示对原始值的引用将是   发送到功能(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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

改变这个:

testingRoutine (trythis)

到此:

testingRoutine trythis

然后尝试一下。

另外,如果我将其更改为此函数,看看会发生什么,函数被用作函数(返回一些东西)

Sub test1()

    Dim trythis As Boolean
    Dim testit As Boolean

    trythis = False

    If (Sheets("Sheet1").Range("A1").Value = 1) Then
        testit = 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) As Boolean

    Debug.Print "Ran Function"
    trythis = True

End Function

答案 2 :(得分:1)

我会这样做。

Sub test1()

    Dim trythis As Boolean

    trythis = False

    If (Sheets("TESTING").Range("A1").value = 1) Then
        tr = testingRoutine(trythis)
        If tr 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"
    testingRoutine = True

End Function

因为trythis不是全局变量,所以在函数中更改它将不会在sub中执行任何操作。它只会在函数中将trythis定义为True并保留在该范围内。要让trythis受到函数的影响并通过子函数读取,您必须将其分配给子中的变量。

答案 3 :(得分:0)

我不记得我在哪里读到这个,但是我知道如果你在调用子/函数时将参数()添加到参数,它是一种特定的(不是错误的)微软实现的解决方法byref调用( to byval)。

示例:假设你调用一个只有byref和2个参数的子:

call Sub1 (a), (b)

是强制Byval参数的正确方法,即使它们最初被编码为Byval