使用VBA跨工作表复制数据留存日志触发1004运行错误求解
错误原因
你的代码触发1004错误主要有3个问题:
- 跨表引用未限定工作表:
With Sheets("Total")代码块内的Range("B2")前缺少点.前缀,默认引用当前激活的工作表而非Total工作表,跨表操作时会出现范围归属冲突。 - 粘贴逻辑不符合需求:原代码写死
Offset(0, 2)偏移2列,无法实现「始终粘贴到最后一个已填充列右侧」的日志留存逻辑,且手动构造粘贴范围很容易出现复制/粘贴区域尺寸不匹配的问题。 - 复制区域判断不稳定:
Range("E5").End(xlDown).End(xlToRight)的写法在E列存在空单元格时会提前终止判断,无法准确选中你需要的E5:F18数据范围。
修正后可直接运行的代码
Sub CopyPaste() Dim pasteTargetCol As Long ' 关闭屏幕更新减少卡顿 Application.ScreenUpdating = False ' 复制Input表E5:F18的源数据 Sheets("Input").Range("E5:F18").Copy With Sheets("Total") ' 定位第2行最右侧已填充单元格,右移1列得到粘贴起始列 pasteTargetCol = .Cells(2, .Columns.Count).End(xlToLeft).Column + 1 ' 仅指定粘贴区域左上角单元格即可,自动适配复制区域尺寸 .Cells(2, pasteTargetCol).PasteSpecial Paste:=xlValues End With ' 清空剪贴板释放内存 Application.CutCopyMode = False Application.ScreenUpdating = True End Sub
可选调整说明
- 如果后续Input表的数据行数会动态增减,不需要固定为18行,可以把复制代码替换为动态判断写法,自动识别E列从第5行开始的所有连续数据:
With Sheets("Input") .Range("E5:F" & .Range("E" & .Rows.Count).End(xlUp).Row).Copy End With
- 如果你的日志数据不是从第2行开始粘贴,只需要把代码里两处
2(Cells(2, ...)里的行号)改成你需要的起始行号即可。
内容的提问来源于stack exchange,提问作者Carolina Neves
相关产品推荐
相关产品推荐

