首页 > 解决方案 > 从 C# 将数组传递给宏函数

问题描述

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

我的代码如下,MACRO CODE

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

通过传递数组调用宏函数的 C# 代码:

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);

Countryarr 是我要传递的数组

有人可以建议如何将数组传递给宏文件,因为我的功能取决于它吗?

标签: c#.netexcelvba

解决方案


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

将参数声明为数组意味着调用例程必须准确传递该数组类型。如果一个子程序被声明为接收一个数组Long,你必须传递一个数组Long。不是Integer,不是Variant。如果子例程被声明为接收一个数组,情况也是如此Variant——您必须传递一个Variant.

现在,Variant是一种神奇的数据类型。变体可以是任何东西——甚至是数组。当您将参数声明为Variant并传递 a Long(或 a String, or...) 时,VBA 运行时引擎会关注 aVariant的创建,存储Long(or Stringor...) 的内容并跟踪它当前的内容商店。

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

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

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


推荐阅读