VBA数组循环触发Subscript out of range错误9,求排查原因
错误原因及解决办法
1. 下标越界的核心原因
你遇到的subscript out of range error 9有两个关键诱因:
- 数组列索引错误:
arr是从工作表第59列到60列提取的区域,这个数组的列数只有2列,列索引只能是1和2。但你在循环里用了原始的工作表列号c1=59、c2=60去访问数组,数组根本没有这么多列,直接触发越界。 - 数组行索引错误:
arr的第一行对应工作表的第6行(因为你是从rw=ws.Rows(6)开始提取的区域),工作表第7行对应数组的第2行。但你的循环从i=7开始,而UBound(arr)是数组的总行数(比如lastR=100时数组只有95行),i=7已经超出数组的行索引范围。
2. 关于用1/2替代c1/c2的问题
必须用1和2来访问数组的列,但要先修正行索引的问题,否则还是会出错。
3. 修正后的代码
Dim c1 As Variant Dim c2 As Variant Dim arr() as Variant Set rw = ws.Rows(6) lastR = ws.Range("A" & ws.Rows.Count).End(xlUp).Row c1 = Application.Match("Col 59)", rw, 0) '注意此处"Col 59)"多了一个右括号,建议检查表头文本是否准确 c2 = Application.Match("Col 60", rw, 0) If Not IsError(c1) And Not IsError(c2) Then '确认找到两个目标表头 arr = ws.Range(rw.Cells(c1), rw.Cells(c2)).Resize(lastR - rw.Row + 1).Value2 '修正Resize行数,取从第6行到lastR行的有效数据 Else MsgBox "One or both required column headers not found!" Exit Sub '找不到表头直接退出,避免后续代码报错 End If '循环查找单列为空的行 For i = 2 To UBound(arr) '数组第2行对应工作表第7行 '用1和2访问数组的两列 If (arr(i, 1) <> "" And arr(i, 2) = "") Or (arr(i, 2) <> "" And arr(i, 1) = "") Then addToRange rngCopy, ws.Range("A" & (rw.Row + i - 1)) '计算对应工作表行号:6+2-1=7,匹配目标行 End If Next i
额外提示
- 检查
Application.Match("Col 59)", rw, 0)中的表头文本,"Col 59)"多了一个右括号,可能导致匹配失败,需和实际表头保持一致。 - 原代码中
Resize(lastR)会导致数组包含超出工作表实际行数的无效区域,改成Resize(lastR - rw.Row + 1)才能准确提取从第6行到lastR行的有效数据。
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

