Excel VBA跨工作表粘贴数据时报Subscript out of range错误
错误原因
- 核心触发下标越界的问题:引用MKSHEET工作表时未给工作表名加双引号,代码中
Worksheets(MKSHEET)的MKSHEET会被VBA识别为未定义的变量,默认值为空,程序无法在工作表集合中匹配到名称为空的工作表,直接抛出下标越界错误,正确的工作表引用格式应为Worksheets("MKSHEET")。 - 粘贴逻辑错误:复制SYSTEMDATA表的内容后,代码写的是调用SYSTEMDATA表的Paste方法,目标却指向MKSHEET的单元格,跨表调用粘贴方法本身就存在逻辑冲突。
- 行号计算逻辑冗余且易错位:每次循环都重复统计MKSHEET的最后一行,且粘贴完第一列数据后没有更新行号,会导致同一行来源的两列数据粘贴到MKSHEET的不同行,甚至覆盖已有内容。
- 变量声明缺失:循环变量i未做显式声明,在开启强制变量校验的环境中会直接触发编译错误。
修正后完整代码
Private Sub CommandButton1_Click() Dim nmrow As Long, avrow As Long, i As Long ' 统计SYSTEMDATA表A列最后一个有内容的行号 nmrow = Worksheets("SYSTEMDATA").Cells(Rows.Count, 1).End(xlUp).Row ' 提前统计MKSHEET表A列初始最后一个有内容的行号,无需循环内重复计算 avrow = Worksheets("MKSHEET").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To nmrow avrow = avrow + 1 ' 直接在Copy方法中指定粘贴目标,省去单独调用Paste的步骤 Worksheets("SYSTEMDATA").Cells(i, 7).Copy Destination:=Worksheets("MKSHEET").Cells(avrow, 2) Worksheets("SYSTEMDATA").Cells(i, 13).Copy Destination:=Worksheets("MKSHEET").Cells(avrow, 3) Next i ' 清空剪贴板,释放内存 Application.CutCopyMode = False End Sub
优化说明
- 所有工作表引用统一使用双引号包裹表名,避免变量未定义导致的下标越界问题
- 直接给Copy方法传入Destination参数,减少剪贴板操作步骤,运行更稳定
- 循环外提前计算MKSHEET初始行号,循环内只做行号递增,既减少重复计算量,也保证同源的两列数据粘贴到同一行,不会错位
- 补全所有变量的显式声明,兼容所有VBA环境配置
- 操作完成后清空剪贴板,避免残留内容影响后续操作
内容的提问来源于stack exchange,提问作者Intel Power
相关产品推荐
相关产品推荐

