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

VBA跨表复制单行报错:Method 'Range'对象方法失败求助

问题排查与修正方案

核心错误原因及修复点

  • 未定义lastRow变量
    代码直接使用lastRow但未声明、未赋值,导致wsTo.Range("A" & lastRow)生成无效的Range地址,这是触发「Method 'Range' of object 'Worksheet' failed」的直接原因。需先计算目标表的最后非空行,确定粘贴起始位置:

    Dim lastRow As Long
    lastRow = wsTo.Cells(wsTo.Rows.Count, "A").End(xlUp).Row + 1 ' 取A列最后行+1,实现追加
    
  • 错误使用ActiveCell.Row
    循环遍历MyCell时,ActiveCell是当前选中单元格,不一定和MyCell所在行一致,应改用MyCell.Row获取当前循环行的行号。

  • 未声明MyRange变量
    代码中使用的MyRange未在开头声明,需补充Dim MyRange As Range,避免隐式变量引发的未知问题。

  • 复制整行不符合需求
    需求是复制少量列数据,原代码的EntireRow.Copy会复制整行,需改为指定列(示例复制C、D、E三列):

    wsFrom.Range("C" & MyCell.Row & ":E" & MyCell.Row).Copy wsTo.Range("A" & lastRow)
    

修正后的完整代码

Dim MyCell As Range, MyRange As Range, wsFrom As Worksheet, wsTo As Worksheet
Dim lastRow As Long

Set wsFrom = Sheets("Sheet 0")
Set MyRange = wsFrom.Range("C3:C2000")

For Each MyCell In MyRange
    If Len(MyCell.Value) > 0 Then
        If Not sheetExist(MyCell.Value) Then
            Set wsTo = Worksheets.Add(After:=Worksheets(Worksheets.Count))
            wsTo.Name = MyCell.Value
        Else
            Set wsTo = Worksheets(MyCell.Value)
        End If
        
        ' 计算目标表A列最后非空行,+1实现追加
        lastRow = wsTo.Cells(wsTo.Rows.Count, "A").End(xlUp).Row + 1
        ' 复制指定列(示例为C、D、E列)到目标表
        wsFrom.Range("C" & MyCell.Row & ":E" & MyCell.Row).Copy wsTo.Range("A" & lastRow)
    End If
Next MyCell

Function sheetExist(sSheet As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ActiveWorkbook.Sheets(sSheet)
    On Error GoTo 0 ' 恢复错误处理
    sheetExist = Not (ws Is Nothing)
End Function

内容的提问来源于stack exchange,提问作者DaveC426913

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:35:01