我试图尝试JaredPar回答的问题ByRef vs ByVal Clarification
VB.NET中的VB.NET中的
ByVal
表示将发送所提供值的副本 到功能。对于值类型(Integer
,Single
等),这将是 提供值的浅表副本。对于更大的类型,这可以 效率低下。但是对于参考类型(String
,类实例)a 传递的副本被传递。因为副本是通过突变传递的 通过=
参数,它不会对调用函数可见。
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
答案 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