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

时间:2019-12-16 00:28:37

标签: 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("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

生成“类型不匹配”错误,并且不会调用TestMacro方法。在VBA中,我可以编写Sub来接受这种类型的“变体”。我该如何使用ExcelDNA?

1 个答案:

答案 0 :(得分:1)

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

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

这里有一个很好的分步示例:https://github.com/Excel-DNA/Samples/tree/master/DnaComServer

如果您希望保留通过Application.Run调用的简单宏,并希望传递包含工作表引用的数组,则可能需要传递地址或类似的内容。