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
关键优化说明
- 移除冲突变量:删掉了
Cells() As String和Columns As Range的声明,避免和Excel内置对象重名。 - 直接引用对象:用
Set定义工作表变量,全程不需要切换激活工作表,代码更稳定高效。 - 正确获取最后一行:使用
rawSheet.Cells(rawSheet.Rows.Count, "A").End(xlUp).Row替代Select方式,能准确找到数据的最后一行,不会因为中间有空行出错。 - 简化复制操作:用
Copy Destination:=直接指定粘贴目标,避免了繁琐的Select和Paste操作,减少出错概率。
内容的提问来源于stack exchange,提问作者Isaac Tang
相关产品推荐
相关产品推荐

