VBA CVar功能何时实际有用?
VBA根据需要隐式地将值转换为VBA CVar功能何时实际有用?,vba,language-lawyer,Vba,Language Lawyer,VBA根据需要隐式地将值转换为变量,那个么该变量的用例是什么呢?在中,对CVar的调用显然是多余的 确切地说,我正在寻找一个具体的、最小的VBA代码示例 编译,但是 当(仅!)CVar(…某些表达式…替换为…某些表达式…时,不会编译(或生成不同的输出) 我还没有找到这样的例子,但也许其他人可以。我想不出以下内容的实际用法,但至少它表明您可能需要该功能: Sub test() Dim myInt As Integer myInt = 2 ' The following
变量
,那个么该变量的用例是什么呢?在中,对CVar
的调用显然是多余的
确切地说,我正在寻找一个具体的、最小的VBA代码示例
- 编译,但是
- 当(仅!)
替换为CVar(…某些表达式…
时,不会编译(或生成不同的输出)…某些表达式…
我还没有找到这样的例子,但也许其他人可以。我想不出以下内容的实际用法,但至少它表明您可能需要该功能:
Sub test()
Dim myInt As Integer
myInt = 2
' The following call will throw a runtime error in testSub
Call testSub(myInt)
' That's okay
Call testSub(CVar(myInt))
End Sub
Sub testSub(ByRef p As Variant)
Debug.Print "P: " & VarType(p)
p = "ABC"
End Sub
不确定这是否符合条件,但我唯一能想到的是与
中的任何进行交互
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, source As Any, ByVal Length As Long)
Sub Test()
Dim source As Long, dest As Long
source = 42
CopyMemory dest, CVar(source), 4
MsgBox dest
CopyMemory dest, source, 4
MsgBox dest
End Sub
这是一个很好的例子,我希望它会引起编译时byref不匹配,但事实并非如此。但是这类问题通常与调用testSub((myInt))
有关。在您的示例中,myInt
也作为变量传递,但是。()
删除该标志。这是一个有趣的主题,有着有趣的结果,例如,请参见。@GSerg:出于好奇:您知道如何读取VBA中的VT标志吗?是的,从VarPtr(该变量)
开始读取前两个字节。举个例子:不错!我考虑过重载,但拒绝了这个想法,因为VBA本身不支持它,并且完全忘记了像任何
一样使用进行重载。