【发布时间】:2017-10-26 17:00:51
【问题描述】:
我尝试过 JaredPar ByRef vs 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
【问题讨论】:
-
悲伤..这一切都在 Documentation.SO 中得到了彻底的记录——现在已经不复存在了。如果您不放弃这种习惯,那么您对多余括号的使用将在某一天或另一天咬到您@$$。此外,
Function过程应该有一个返回类型 -Private Function testingRoutine(ByRef tryThis As Boolean) As Boolean- 否则你会将返回值包装到Variant中。请注意,在 VBA 中,隐式默认值为ByRef(这很愚蠢,这就是 VB.NET 修复它的原因)。请参阅 this answer 了解更多ByRef/ByVal涉及数组的疯狂。 -
@Mat'sMug 感谢您提供信息;如果我不打算用函数返回值,我应该使用什么?那么是潜艇吗?
-
是的。
Function接受一些输入并返回结果。Sub做某事,通常带有副作用(对象、应用程序或全局状态的更改)。 -
我觉得烦人的是每次我去查看我的宏列表时,每个子功能都在这里列出......有没有办法避免这种情况?
-
这是非常有用的信息,非常感谢!我只是进行了很多试验和错误,看看哪些有效,哪些无效。如果您可以将此信息放在答案格式中,我很乐意为您提供已回答的标记:)