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

VBA复制行至其他工作表时出现Run time error '91'的问题求助

解决VBA Run-time Error '91':复制指定行到另一工作表的问题

你的代码触发Run-time Error '91'(对象变量或With块变量未设置)主要有几个关键问题,我来逐一拆解并给出修复方案:

错误原因详解

  • 变量名与内置对象冲突:你声明了Cells() As String,这和Excel内置的Cells对象(用于引用单元格)重名了,导致VBA无法正确识别你要访问的单元格对象。
  • 条件判断语法错误:If Cells(r, Columns(17).Value = "Y") Then这一行完全写错了逻辑——你想检查第17列(Q列)第r行的单元格值是否为"Y",正确的写法应该是Cells(r, 17).Value = "Y",而不是把判断逻辑塞进Cells的参数里。
  • 依赖Select/ActiveCell的不稳定写法:大量使用Select和ActiveCell切换工作表和单元格,不仅效率低,还容易因为上下文切换不及时导致对象引用失效,这也是触发错误的潜在因素。

修正后的代码

Sub retrieve()
    Dim r As Long, endrow As Long, pasterowindex As Long
    Dim rawSheet As Worksheet, completedSheet As Worksheet
    
    ' 提前定义工作表对象,避免反复切换激活
    Set rawSheet = ThisWorkbook.Sheets("Raw Trade Log")
    Set completedSheet = ThisWorkbook.Sheets("Completed Trade log")
    
    ' 安全获取原始数据的最后一行(无需Select操作)
    endrow = rawSheet.Cells(rawSheet.Rows.Count, "A").End(xlUp).Row
    pasterowindex = 1 ' 目标工作表的起始粘贴行
    
    ' 遍历原始数据行
    For r = 4 To endrow
        ' 检查第17列(Q列)的值是否为"Y"
        If rawSheet.Cells(r, 17).Value = "Y" Then
            ' 直接复制整行到目标位置,省去Select/Paste步骤
            rawSheet.Rows(r).Copy Destination:=completedSheet.Rows(pasterowindex)
            pasterowindex = pasterowindex + 1
        End If
    Next r
End Sub

关键优化说明

  1. 移除冲突变量:删掉了Cells() As String和Columns As Range的声明,避免和Excel内置对象重名。
  2. 直接引用对象:用Set定义工作表变量,全程不需要切换激活工作表,代码更稳定高效。
  3. 正确获取最后一行:使用rawSheet.Cells(rawSheet.Rows.Count, "A").End(xlUp).Row替代Select方式,能准确找到数据的最后一行,不会因为中间有空行出错。
  4. 简化复制操作:用Copy Destination:=直接指定粘贴目标,避免了繁琐的Select和Paste操作,减少出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:02