Excel VBA跨工作表转置粘贴时出现Error 1004错误求助
解决VBA跨工作表转置时偶尔触发的Error 1004问题
这个Error 1004的坑我踩过好多次了!本质是你的代码过度依赖活动工作表,而Excel在后台偶尔会有一些隐性操作(比如自动计算、工作表事件触发、甚至用户不小心点了别的表),导致执行过程中活动表偷偷切换,让你的复制/粘贴操作意外落到同一张工作表上,就触发了“复制粘贴区域不能相同”的错误。
原代码的核心问题
你看这段代码:
With Worksheets("1") LastRow1 = .Cells(Rows.Count, "A").End(xlUp).Row Range("A1:EE" & LastRow1).Copy End With
虽然在With Worksheets("1")块里,但Range("A1:EE" & LastRow1)前面没有加.,所以它并没有绑定到Worksheets("1"),而是引用当前活动工作表的区域!这就是最大的隐患——如果执行到这行时活动表不是"1",复制的就是错误的区域;如果后续粘贴时活动表又被切换,就可能出现同表粘贴的情况。
另外,后面用Worksheets("3").Activate再粘贴的写法,也完全依赖活动表,稳定性很差。
修正后的稳定代码
推荐两种写法,按需选择:
写法1:改进复制粘贴(保留格式)
这种写法保留了原有的复制粘贴逻辑,但彻底摆脱对活动表的依赖:
Dim LastRow1 As Long Dim sourceSheet As Worksheet Dim targetSheet As Worksheet ' 明确绑定工作表对象,避免依赖活动表 Set sourceSheet = ThisWorkbook.Worksheets("1") Set targetSheet = ThisWorkbook.Worksheets("3") With sourceSheet ' 注意.Rows前面也要加.,避免引用全局Rows LastRow1 = .Cells(.Rows.Count, "A").End(xlUp).Row ' 加.明确引用源工作表的区域 .Range("A1:EE" & LastRow1).Copy End With ' 直接指定目标工作表的单元格粘贴,不需要Activate targetSheet.Range("A1").PasteSpecial Transpose:=True ' 清理剪贴板,避免残留内容影响后续操作 Application.CutCopyMode = False MsgBox "Transpose Completed"
写法2:直接转置赋值(仅复制值,更高效)
如果不需要保留单元格格式,直接用转置赋值的方式更快、更稳定,还不会占用剪贴板:
Dim LastRow1 As Long Dim sourceSheet As Worksheet Dim targetSheet As Worksheet Dim sourceRange As Range Set sourceSheet = ThisWorkbook.Worksheets("1") Set targetSheet = ThisWorkbook.Worksheets("3") With sourceSheet LastRow1 = .Cells(.Rows.Count, "A").End(xlUp).Row Set sourceRange = .Range("A1:EE" & LastRow1) End With ' 用Resize匹配转置后的区域大小,直接赋值 targetSheet.Range("A1").Resize(sourceRange.Columns.Count, sourceRange.Rows.Count).Value = Application.Transpose(sourceRange.Value) MsgBox "Transpose Completed"
额外的稳定性建议
- 尽量用工作表的CodeName代替名称引用:在VBA编辑器的属性窗口里,找到工作表的
(Name)字段(比如Sheet1),直接写Set sourceSheet = Sheet1,这样就算用户改了工作表名称,代码也不会出错。 - 加上错误处理:可以让程序在出错时友好提示并清理资源:
On Error GoTo ErrorHandler ' 这里放你的核心代码 Exit Sub ErrorHandler: MsgBox "执行出错:" & Err.Description & " 错误代码:" & Err.Number Application.CutCopyMode = False
内容的提问来源于stack exchange,提问作者Ragavsn




