You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:55:32