VBA Excel数组下标越界问题:从区域或ListObject填充数组
问题描述
我尝试通过直接赋值工作表区域或ListObject的DataBodyRange.Value来填充数组,数组尺寸显示正确(LBound为1,UBound为7),但读取数组元素时调用arrSearch(6)返回下标越界错误。请问问题出在哪里?是否必须通过循环迭代填充数组?
dim arrsearch() as variant 'tried both of these... arrSearch = ThisWorkbook.Worksheets("Sheet1").ListObjects("Table3").DataBodyRange.Value arrSearch = ThisWorkbook.Worksheets("Sheet1").Range("C4:C10").Value Debug.Print LBound(arrSearch) ' this works (it's 1) Debug.Print uBound(arrSearch) ' this works (it's 7) Debug.Print arrSearch(6) ' this doesn't work - returns subscript out of range error.
问题原因与解决方法
核心问题:二维数组的访问方式错误
直接将Excel单元格区域(包括ListObject的DataBodyRange)赋值给Variant数组时,无论区域是单列还是单行,Excel都会返回一个二维数组。你的例子中C4:C10是7行1列的区域,生成的数组结构为arrSearch(1 to 7, 1 to 1)。仅用arrSearch(6)访问时,只提供了行下标、缺少列下标,VBA无法识别,因此抛出下标越界错误。正确的访问方式
读取第6行的元素时,需要同时指定行和列下标:Debug.Print arrSearch(6, 1)无需循环填充数组
直接赋值的方式完全可行,且比循环填充效率更高,不需要改用循环迭代。如果需要将二维数组转为一维数组,可以用Application.Transpose处理:arrSearch = Application.Transpose(ThisWorkbook.Worksheets("Sheet1").Range("C4:C10").Value) ' 此时数组变为一维,可直接用arrSearch(6)访问
内容的提问来源于stack exchange,提问作者stephen pincher
相关产品推荐
相关产品推荐

