VBA CVar功能何时实际有用?

VBA CVar功能何时实际有用?,vba,language-lawyer,Vba,Language Lawyer,VBA根据需要隐式地将值转换为变量,那个么该变量的用例是什么呢?在中,对CVar的调用显然是多余的 确切地说,我正在寻找一个具体的、最小的VBA代码示例 编译,但是 当(仅!)CVar(…某些表达式…替换为…某些表达式…时,不会编译(或生成不同的输出) 我还没有找到这样的例子,但也许其他人可以。我想不出以下内容的实际用法,但至少它表明您可能需要该功能: Sub test() Dim myInt As Integer myInt = 2 ' The following

VBA根据需要隐式地将值转换为
变量
,那个么该变量的用例是什么呢?在中,对
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本身不支持它,并且完全忘记了像任何
一样使用
进行重载。