如何使用ExcelDNA将变体数组传递给C#

如何使用ExcelDNA将变体数组传递给C#,c#,excel-dna,C#,Excel Dna,如果我有这样的c#方法: [ExcelFunction(IsMacroType = true)] public static void TestMacro([ExcelArgument(AllowReference = true)]object rngTable, [ExcelArgument(AllowReference = true)]object varCalc) { System.Windows.Forms.MessageBox.Show("Tes

如果我有这样的c#方法:

    [ExcelFunction(IsMacroType = true)]
    public static void TestMacro([ExcelArgument(AllowReference = true)]object rngTable, [ExcelArgument(AllowReference = true)]object varCalc)
    {
        System.Windows.Forms.MessageBox.Show("TestMacro called!");
    }
我可以使用以下代码从VBA成功调用它:

Sub TestIt()
    Application.Run "TestMacro", Range("a1"), Range("a2")
End Sub
Sub TestIt2()
    Dim v(1 To 1) As Variant
    Set v(1) = Range("a2")
    Application.Run "TestMacro", Range("a1"), v
End Sub
但是从这个代码调用它:

Sub TestIt()
    Application.Run "TestMacro", Range("a1"), Range("a2")
End Sub
Sub TestIt2()
    Dim v(1 To 1) As Variant
    Set v(1) = Range("a2")
    Application.Run "TestMacro", Range("a1"), v
End Sub
生成“类型不匹配”错误,并且未调用TestMacro方法。在VBA中,我可以编写SUB来接受这种类型的“变体”。如何使用ExcelDNA执行此操作?

Excel C API(Excel DNA用于公开函数和宏)不支持数组参数内的工作表引用

如果您的主要目标是制作一个可以从VBA轻松调用的外接程序,则可以使用Excel DNA的COM服务器功能公开一个类库,您可以通过工具->引用和创建新对象等从VBA调用该类库。然后,集成不通过Excel C API,而是直接通过COM接口

这里有一个很好的一步一步的例子来说明如何做到这一点:

如果希望继续使用通过
应用程序调用的简单宏。运行
,并希望传入包含工作表引用的数组,则可能需要传入地址或类似的内容