将ListObject列范围转为数组时出现“下标越界”错误求助
解决ListObject列转数组后下标越界的问题
嘿,这个坑我之前踩过!你遇到的问题核心在于:ListofSC并不是一维数组,而是一个二维数组——哪怕你只提取了ListObject的单列数据。
为什么会这样?
当你把Excel单元格区域(包括ListColumn.DataBodyRange)直接赋值给Variant变量时,Excel会默认将其转换为二维数组,维度格式是(行号, 列号)。哪怕只有一列,数组的第二维度依然存在,范围是1到1(因为Excel的单元格区域默认从1开始索引)。
你用LBound(ListofSC)和UBound(ListofSC)查看的是数组第一维度(行)的上下界,所以得到1和708是正确的,但访问ListofSC(1)时,相当于只指定了行号,没指定列号,VBA会默认用0作为列下标,而你的数组列下标是从1开始的,自然就报“下标越界”了。
怎么解决?
有两种简单的处理方式:
1. 直接按二维数组访问
如果你不想改动数组结构,直接用行列双下标访问即可:
MsgBox (ListofSC(1, 1)) ' 访问第1行第1列的值
2. 转成一维数组
如果你更习惯用一维数组遍历,可以用Application.Transpose把二维数组转成一维:
Dim ListofSC As Variant ' 转置后得到一维数组 ListofSC = Application.Transpose(SCtbl.ListColumns("long_shortcut").DataBodyRange.Value) MsgBox (ListofSC(1)) ' 现在就能正常访问了
注意:如果你的ListObject行数超过65536,早期Excel版本的
Transpose可能会有问题,但现在主流的Excel版本(2016+)已经支持更大的数组了。
另外,你可以用UBound(ListofSC, 2)来验证数组的第二维度,运行后会返回1,这也能直观证明它是二维数组。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

