VBA中arr(x,x)与arr(x)(x)的区别及二维数组生成方法
两类数组的区别
- 嵌套数组(锯齿数组):你第一次实现得到的就是这类数组,本质是一维数组,每个元素本身又是独立的一维数组。各内层数组长度可以不一致,内存存储不连续,因此需要使用
arr(x)(y)的格式两次索引才能定位到目标值:第一次取到外层数组对应的内层数组,第二次取内层数组的对应元素。 - 二维数组:你需要的是这类结构,是单一的连续内存存储的数组,定义时就固定了两个维度的长度,直接用
arr(x,y)的格式就可以一次定位到对应元素。
报错原因
你第二段代码的写法不符合二维数组的赋值规则:二维数组不支持直接对某一整行/整列批量赋值,arr(1) = xxx的语法仅适用于嵌套数组的外层元素赋值,用在二维数组上就会触发「索引不属于选择范围」的越界错误。同时你没有注意到数据是从第2行开始,第二维的长度应该是endRow - 1而非endRow,这也是可能触发报错的原因之一。
解决方法
最稳妥的实现方式是循环遍历两列数据,逐个写入二维数组的对应位置,7000行的循环量对VBA来说完全没有性能压力:
Sub main() Dim endRow As Long, i As Long Dim arr As Variant ' 直接指定工作表引用比激活工作表更稳定,避免误操作其他工作表 With Sheets("data") endRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' 第一维存2列数据,第二维存对应行的数值,从A2开始共endRow-1条数据 ReDim arr(1 To 2, 1 To endRow - 1) For i = 2 To endRow arr(1, i - 1) = .Cells(i, "A").Value arr(2, i - 1) = .Cells(i, "H").Value Next i End With ' 后续可直接用arr(x,y)格式访问数组元素 End Sub
内容的提问来源于stack exchange,提问作者user17320474
相关产品推荐
相关产品推荐

