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
相关产品推荐
相关产品推荐

