从C#

时间:2018-11-21 08:03:10

标签: c# .net excel vba excel-vba

我试图将数组变量作为参数传递给宏函数,但是在调用此宏文件时出现错误不匹配的情况,

我的代码如下,宏代码

Sub arraydef(arr() As Variant)
    MsgBox (arr(0))
End Sub

C#代码,用于通过传递数组来调用Macro函数:

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkBook;
xlWorkBook = xlApp.Workbooks.Open(Server.MapPath("\\MacroFile\\MYTEFINAL1.xlsm"));
xlApp.Visible = false;
xlApp.Run("arraydef", Countryarr);

Counterarr是我要传递的数组

有人可以建议我如何将数组传递给宏文件吗?

1 个答案:

答案 0 :(得分:1)

基本上,将 something 数组传递给VBA中的子例程时,最简单的解决方案是将参数声明为Variant

将参数声明为数组意味着调用例程必须完全传递该数组类型。如果声明子例程接收Long数组,则必须传递Long数组。不是Integer,不是Variant。如果声明子例程接收Variant数组,则情况也是如此-您必须传递Variant数组。

现在,Variant是一种神奇的数据类型。变体可以是任何-甚至是数组。当您将参数声明为Variant并传递Long(或String或...)时,VBA运行时引擎会注意创建一个Variant ,存储Long(或String或...)的内容,并跟踪其当前存储的内容。

如果将数组传递给该Variant,则VBA将该数组存储在Variant(可能仅是引用)中,不仅跟踪它包含数组的事实,而且还跟踪该数组的类型。

但是,如果将参数声明为Variant的数组,则运行时将无法发挥其魔力。您告诉运行时您将获得一堆Variants,但是随后您将传递一堆Integer。运行时将必须将数组的每个元素从Integer转换为Variant -并且它根本不这样做。相反,VBA编译器会抱怨,或者在通过Application.Run调用时抛出“类型不匹配” 运行时错误。

有些功能可以帮助您获取信息(当前)存储在变量中的信息:IsArray告诉您Variant是否包含错误,而VarType会为您提供有关类型的信息(有关VarType的更多信息,请参见https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function)。 LBoundUbound将为您提供数组的大小。您唯一无法获得的是有关数组维数的信息。在极少数情况下,您不知道尺寸的数量,https://stackoverflow.com/a/6902088/7599798可以为您提供解决方案。