c# - 从 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 是我要传递的数组
有人可以建议如何将数组传递给宏文件,因为我的功能取决于它吗?
解决方案
基本上,当将数组传递给 VBA 中的子例程时,最简单的解决方案是将参数声明为Variant
.
将参数声明为数组意味着调用例程必须准确传递该数组类型。如果一个子程序被声明为接收一个数组Long
,你必须传递一个数组Long
。不是Integer
,不是Variant
。如果子例程被声明为接收一个数组,情况也是如此Variant
——您必须传递一个Variant
.
现在,Variant
是一种神奇的数据类型。变体可以是任何东西——甚至是数组。当您将参数声明为Variant
并传递 a Long
(或 a String
, or...) 时,VBA 运行时引擎会关注 aVariant
的创建,存储Long
(or String
or...) 的内容并跟踪它当前的内容商店。
如果您将一个数组传递给该变量,VBA 将该数组存储在Variant
(可能只是一个引用)中,并不仅跟踪它包含数组的事实,而且跟踪数组的类型。
但是,如果您将参数声明为 的数组Variant
,则运行时无法发挥其魔力。你告诉运行时你会得到Variants
一堆Integer
. 运行时必须将数组的每个元素从转换Integer
为Variant
- 而它根本不这样做。相反,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可以为您提供解决方案。
推荐阅读
- c# - C# .net Core 和 Oracle 集编码
- php - 检查令牌是否在 Laravel 中过期
- javascript - 类型错误:db.close 不是函数
- android - 从 worldcam travel API 预览直播视频
- node.js - 尝试通过云功能将文件从存储上传到 FTP 服务器时超时
- javascript - ( Opencart v2.3 ) 在 iphone 中清空 (minicart) 中的所有购物车项目
- mysql - 在 MySQL 中使用多个 JOIN 表声明一个变量
- javascript - Listen / Observe - 使用 store.js 更改 LocalStorage
- php - 在循环中获取数组的增量
- unix - 在 Solaris 中使用 exec 的 fcntl()