这一点我个人理解是 Microsoft 还是希望用户以 Range 为核心,配合 Excel 本身的功能,以及这些功能对应的 VBA 调用,以此来完成任务目标; 如果用户的任务目标超越了这个界限用户就应该去使用 Microsoft 的其他产品如 Power BI,VSTO(Visual Studio Tools for Office)借助 C# 应该是想干什么都可以了;或者干脆极易上手 Python,借助 pandas 和 numpy 这些工具来处理 .xlsx .csv 等等;
坑的原因
VBA 数组的坑主要是由三个原因引起的:
1.脚本语言的用户对数据类型的重视度不足;
2.Range对象的存在,造成了数组一些潜规则式的转换机制;可以在下文 “感受 Range 的混乱” 部分体会一下;
3.静态数组和动态数组的一些限制和数据导入规则;这远没有静态语言数组声明后全生命周期大小不可变,扩容需要重新创建来的清晰;
感受 Range 的混乱
如果这部分看蒙了就暂时过的它吧,后面看过 “Array() 和 Range 对象”,“数组初始化方式3”,“数组导入到单元格区域”,在回过头来理解一下这个部分会更有收获;
1.Range("") 赋值给未声明的变量,TypeName 变为 Variant;TypeName() 是获取变量的数据类型;
2.Variant() 不能使用 Range 类型的属性,如,.Address;
3.想要使用 Range 类型的属性,先 Set varName = Range("");
4.对于被 Set 成 Range 类型的变量:
(1)IsArray() 仍然是 True;
(2)不能将 Range 类型的变量赋值给已经声明的数组,报错 “类型不匹配”;
(3)可以赋值给未声明的变量或 Variant 类型的变量(Dim x 或 Dim x as Variant),该 Range 类型的变量会自动转型为 Variant();
前面提到从 Range("") 导入的数组,即是是一行,也是二维数组,即 Range("A1:J1") 是 (1 to 1, 1 to 10) 的二维数组;
(1 to 1, 1 to 10) 形式的数组,也可以通过 Transpose 转置为一列数组,因此可以利用这个机制将一个 (1 to 1, 1 to 10) 转变为一个 (1 to 10) 的数组;