我试图将数组变量作为参数传递给宏函数,但是在调用此宏文件时出现错误不匹配的情况,
我的代码如下,宏代码
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是我要传递的数组
有人可以建议我如何将数组传递给宏文件吗?
答案 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)。 LBound
和Ubound
将为您提供数组的大小。您唯一无法获得的是有关数组维数的信息。在极少数情况下,您不知道尺寸的数量,https://stackoverflow.com/a/6902088/7599798可以为您提供解决方案。