You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:35:44