VBA运行时错误'9'(下标越界):多工作表数据合并问题排查
解决VBA合并工作表数据时的下标越界错误
错误原因分析
- 最后一行计算逻辑错误:原代码中
Range("Batters (OF) - Bat X" & Rows.Count)错误地将工作表名称与行数拼接,导致引用了不存在的单元格区域,触发下标越界。正确做法是指定具体列(如A列)来获取最后一行。 - 目标列引用无效:
Cells(Rows.Count, "Batters (OF) - Bat X")把工作表名称当作列名使用,列名只能是字母或数字序号,这会导致列引用失败。 - 不必要的工作表激活:使用
.Activate依赖当前活动工作表,容易引发上下文错误,直接通过工作表对象引用更可靠。 - 数据类型溢出风险:
Integer最大仅支持32767行,Excel行数远超这个值,应改用Long类型避免溢出。
修正后的代码
Sub CopyRange() Dim bottomD As Long Dim targetWs As Worksheet Dim ws As Worksheet Dim targetLastRow As Long ' 提前绑定目标工作表,减少重复查找开销 Set targetWs = ThisWorkbook.Sheets("Batters - Bat X") For Each ws In ThisWorkbook.Sheets(Array("Batters (OF) - Bat X", "Batters (SS) - Bat X", "Batters (3B) - Bat X", "Batters (2B) - Bat X")) ' 获取当前工作表A列最后一行行号 bottomD = ws.Range("A" & ws.Rows.Count).End(xlUp).Row ' 仅当存在有效数据(A2及以下)时执行复制 If bottomD >= 2 Then ' 获取目标工作表A列最后一行的下一行位置 targetLastRow = targetWs.Range("A" & targetWs.Rows.Count).End(xlUp).Offset(1, 0).Row ' 复制指定区域到目标工作表 ws.Range("A2:D" & bottomD).Copy targetWs.Range("A" & targetLastRow) End If Next ws End Sub
额外优化说明
- 增加
bottomD >= 2的判断,避免工作表只有表头时复制空区域 - 使用
ThisWorkbook明确指定当前工作簿,防止误引用其他打开的工作簿 - 提前定义目标工作表对象,提升代码执行效率
内容的提问来源于stack exchange,提问作者Tyler Bradburn
相关产品推荐
相关产品推荐

