VBA中使用For循环遍历Variant数组出现下标越界错误求助
问题根因
从Excel单元格区域直接赋值给Variant生成的数组是二维数组,哪怕是单行、单列这种看似一维的区域,VBA都会保留二维结构:第一维对应行,第二维对应列。你原代码里用strArray(i)、lenArray(i)只传了一个下标,维度不匹配,自然会报下标越界。
你之前用For Each能正常遍历,是因为For Each语法不需要手动指定下标,会按顺序枚举数组所有元素,所以不会触发这个错误。之前试的硬编码循环范围没有修改数组下标的访问方式,所以一样运行失败。
修正后可运行代码
Sub Button1_Click() Dim lenArray As Variant Dim strArray As Variant Dim strCombined As String Dim space As String lenArray = Range("D1:J1").Value strArray = Range("D2:J2").Value space = " " Dim i As Integer Dim temp As String ' 单行区域第一维下标固定为1,遍历第二维(列维度)即可 For i = LBound(strArray, 2) To UBound(strArray, 2) strCombined = strCombined & strArray(1, i) temp = WorksheetFunction.Rept(space, CInt(lenArray(1, i)) - Len(strArray(1, i))) strCombined = strCombined & temp Next i Range("B4").Value = strCombined End Sub
关键修改点
- 取数组边界时指定维度参数:
LBound(数组名, 2)代表取数组第二维的最小下标,UBound(数组名, 2)取第二维最大下标,自动适配你选中的列范围,不需要硬编码1到7的循环值,后续调整拼接的列范围时不用修改循环代码 - 访问数组元素时补全两个维度下标:因为你取的是单行区域,第一维(行)下标固定为1,所以元素要写成
数组名(1, 列下标)的格式
小提示:如果后续需要处理多行多列的固定宽度拼接,只需要在外层加一层遍历第一维(行)的循环即可,逻辑和本次修改完全一致。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

