Gre*_*reg 5 vba parameter-passing wrapper user-defined-functions paramarray
我正在创建一个名为 的 VBA 函数 (UDF) MyUDF(),它包装CallByName().
我希望精确模仿 的签名和参数行为CallByName()。此外,MyUDF()必须将其Args()参数复制到模块化变量ArgsCopy\xe2\x80\x94 一个Variant数组 \xe2\x80\x94 ,然后将其元素MyUDF()作为进一步的参数传递给CallByName()传递给。
不要问为什么 \xe2\x80\x94 这是一个很长的故事。
\nCallByName()在 VBA 编辑器中显示如下

文档中是这样描述的:
\n\n\n句法
\nCallByName (对象,过程名称,调用类型, [args()]_)
\nCallByName函数语法具有以下命名参数:
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n
部分 描述 目的 必需:变体(对象)。将在其上执行函数的对象的名称。 进程名 必需:变体(字符串)。包含对象的属性或方法名称的字符串表达式。 呼叫类型 要求:常数。vbCallType类型的常量,表示正在调用的过程的类型。 参数() 可选:变体(数组)。
看来“ args()”实际上是一个ParamArray,而不是一个简单的Variant数组,但没有进一步的文档,我不能完全确定。
我的初步设计是以下形式:
\n\' Modular variable.\nPrivate ArgsCopy() As Variant\n\n\n\' Wrapper function.\nPublic Function MyUDF( _\n ByRef Object As Object, _\n ByRef ProcName As String, _\n CallType As VbCallType, _\n ParamArray Args() As Variant _\n)\n \' ...\n \n \' Copy the argument list to the modular variable.\n ArgsCopy = Args\n \n \' ...\n \n \' Pass the arguments (and modular variable) to \'CallByName()\'.\n MyUDF = VBA.CallByName( _\n Object := Object, _\n ProcName := ProcName, _\n CallType := CallType, _\n Args := ArgsCopy _\n )\nEnd Function\nRun Code Online (Sandbox Code Playgroud)\n与 相比CallByName(),MyUDF()在 VBA 编辑器中显示如下,并以 结尾ParamArray Args() As Variant:

只有将Args()a改为ParamArray数组Variant( ByRef Args() As Variant) 才能使它们显示相同:

然而,后者会与下面描述的 的功能行为CallByName()发生冲突。
不幸的是,不能通过名称 ( )ArgsCopy传递,因为显然是 a并且因此只接受未命名的参数:ArgsArgs := ArgsCopyArgsParamArray
VBA.CallByName( _\n Object, ProcName, CallType, _\n ArgsCopy(0), ArgsCopy(1), ..., ArgsCopy(n) _\n)\nRun Code Online (Sandbox Code Playgroud)\nCallByName()请忽略返回 a的事实Variant,它可能(或可能不是)Object一定是Set。我已经在我的实际代码中考虑到了这一点。
我如何构建MyUDF(),特别是它的Args()论点,使得
CallByName()它的签名在参数的Type和Optionality 方面都模仿 的签名;和CallByName()中列出的任意一组参数Args()?理想情况下,MyUDF()还将
CallByName()像在 VBA 编辑器中

第三和第四个标准是额外的,但我不要求它们。
\nVisual Basic (VB)建议您可以将参数传递给 it,ParamArray如上所示MyUDF():参数是与 类型相同的数组中的元素ParamArray,并且该数组作为单个参数提供。但是,我在VB A中既没有找到记录也没有找到等效的实验。
我确实在 Stack Overflow 上找到了这三个 VBA 问题,但我缺乏在这里应用他们的经验的经验。
\n\n第一个问题有一个解决方案,它改变了 的方法签名CallByName(),这样它Args()就是一个参数:一个Any数组。
然而,我不熟悉“ Any”类型,第三个问题(未回答)让我怀疑这个预处理器“魔法”是否可以在Mac上工作:
\n\nRun Code Online (Sandbox Code Playgroud)\n#If VBA7 Or Win64 Then\n Private Declare PtrSafe Function rtcCallByName Lib "VBE7.DLL" ( _\n ByVal Object As Object, _\n ByVal ProcName As LongPtr, _\n ByVal CallType As VbCallType, _\n ByRef args() As Any, _\n Optional ByVal lcid As Long) As Variant\n#Else\n Private Declare Function rtcCallByName Lib "VBE6.DLL" ( _\n ByVal Object As Object, _\n ByVal ProcName As Long, _\n ByVal CallType As VbCallType, _\n ByRef args() As Any, _\n Optional ByVal lcid As Long) As Variant\n#End If\n
Public Function CallWithArgs( _\n ByRef Object As Object, _\n ByRef ProcName As String, _\n CallType As VbCallType, _\n ByRef Args() As Variant _\n)\n CallWithArgs = rtcCallByName(Object, ProcName, CallType, Args)\nEnd Function\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |