VBA运行时错误1004:使用Range方法触发应用/对象定义错误
问题诊断与修复
错误原因
不是变量过多导致的,核心问题是未明确指定Cells对象所属的工作表。
你写的Sheets(i).Range(Cells(2, K), Cells(LastRow, K))中,Range属于Sheets(i),但里面的Cells默认引用的是当前活动工作表,如果活动工作表不是Sheets(i),就会出现跨工作表引用不匹配的1004错误——相当于让Sheet2的Range去引用Sheet1的Cells,VBA无法识别这种混合引用。
修复代码
给所有Cells对象加上工作表限定,同时优化最后一行的计算逻辑(原来的End(3)(2).Row写法不够直观,换成更清晰的+1偏移):
Option Explicit Sub CopyNPaste() Dim Columncount_s1 As Long Dim Columncount As Long Dim i As Long, j As Long, K As Long Dim Sheetcount As Long Dim LastRow_s1 As Long, LastRow As Long Columncount_s1 = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column Sheetcount = ActiveWorkbook.Sheets.Count For i = 2 To Sheetcount Columncount = Sheets(i).Cells(1, Columns.Count).End(xlToLeft).Column For j = 1 To Columncount_s1 For K = 1 To Columncount If Sheets(1).Cells(1, j).Value = Sheets(i).Cells(1, K).Value Then ' 计算Sheet1对应列的下一个空行 LastRow_s1 = Sheets(1).Cells(Rows.Count, j).End(xlUp).Row + 1 ' 计算当前工作表对应列的最后一行数据行 LastRow = Sheets(i).Cells(Rows.Count, K).End(xlUp).Row ' 修复:给Cells加上Sheets(i)限定,避免引用冲突 Sheets(i).Range(Sheets(i).Cells(2, K), Sheets(i).Cells(LastRow, K)).Copy Sheets(1).Cells(LastRow_s1, j).PasteSpecial xlPasteValues End If Next K Next j Next i ' 清除剪贴板,避免弹窗提示 Application.CutCopyMode = False End Sub
进一步优化(可选)
复制粘贴的效率较低,直接赋值可以大幅提升运行速度,替换复制粘贴的两行代码:
' 直接将值赋值到目标区域,跳过剪贴板 Sheets(1).Cells(LastRow_s1, j).Resize(LastRow - 1, 1).Value = _ Sheets(i).Cells(2, K).Resize(LastRow - 1, 1).Value
内容的提问来源于stack exchange,提问作者SiSi
相关产品推荐
相关产品推荐

