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

VBA运行时错误'9'下标越界问题及代码优化咨询

问题解决:VBA下标越界错误及数据清空实现

1. Run-time error '9' 下标越界错误修复

错误出在arr(nr, i) = arr(r, i)行,核心原因是:

  • 原数组arr读取的是DROP工作表的L4:T100区域,该区域仅包含9列(L到T共9列),但代码中循环i = 1 To 12,超出了数组的列数范围,直接触发下标越界。
  • 后续要复制到MASTER的B:J区域同样是9列,完全不需要循环到12列。

修正后的完整代码:

Private Sub CommandButton1_Click()
    Dim r%, nr%, arr, lr&, i%
    arr = Worksheets("DROP").Range("L4:T100")
    
    For r = 1 To UBound(arr)
        If arr(r, 1) <> "" Then
            nr = nr + 1
            ' 循环数组实际的9列(对应L-T区域)
            For i = 1 To 9
                arr(nr, i) = arr(r, i)
            Next i
        End If
    Next r
    
    With Sheets("MASTER")
        lr = .Range("B" & Rows.Count).End(xlUp).Row + 1
        ' 简化写入区域的写法,避免字符串拼接出错
        .Range("B" & lr).Resize(nr, 9) = arr
    End With
    
    ' 完成数据复制后清空指定区域
    Worksheets("DROP").Range("B4:J100").Clear
End Sub

2. 数据复制完成后清空指定区域的实现

直接在代码最后添加Worksheets("DROP").Range("B4:J100").Clear语句即可,注意必须指定目标工作表(避免当前激活工作表非目标表时出错),且放在数据写入MASTER之后执行,确保清空操作在数据复制完成后触发。

额外优化提示:

  • 原代码中.Range("B" & lr & ":" & "J" & lr).Resize(nr)可简化为.Range("B" & lr).Resize(nr, 9),写法更简洁且不易出错。
  • 当前逻辑会自动跳过L4:T100中的空白行,仅保留非空行数据,该逻辑是合理的。

内容的提问来源于stack exchange,提问作者MarkP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:23:25