Excel VBA循环触发Run-time error 91求助:第26次循环报错
解决VBA Run-time Error 91(对象变量未设置)问题
这个Run-time error 91的坑我踩过无数次——本质是你直接把Range.Find的结果当作布尔值判断,但当它找不到匹配的PIN时会返回Nothing(一个不存在的对象),VBA没法把Nothing转换成True/False来做判断,自然就触发错误了。结合你的代码,还有几个可以优化的点,一起给你解决:
核心问题分析
当i=26时,对应的PIN在wbData的G列里找不到,Range("G:G").Find返回Nothing,这时候你写If Range("G:G").Find(...) Then就相当于让VBA判断一个不存在的对象,直接触发错误91。另外你重复调用了两次Find,不仅效率低,还可能因为查找上下文变化导致结果不一致;同时使用Activate/Select很容易因为工作表激活状态意外变化而出错。
修复后的完整代码
Dim wb As Workbook Dim wbData As Workbook Dim wsTarget As Worksheet ' 当前工作簿的目标工作表(Sheet4) Dim wsSource As Worksheet ' 数据源工作簿的工作表(需替换成实际表名) Dim i As Integer Dim PIN As String Dim status As String Dim foundPin As Range ' 存储Find的结果,避免重复查找 Application.ScreenUpdating = False Set wb = ThisWorkbook Set wsTarget = wb.Sheet4 ' 直接引用工作表,无需Select/Activate ' 打开数据源工作簿并绑定对应工作表 Set wbData = Workbooks.Open("C:\test.xlsx", , 1) Set wsSource = wbData.Sheets("Sheet1") ' 这里替换成test.xlsx里实际的工作表名称! For i = 3 To 56 Select Case i Case 23, 24, 40, 41 ' 跳过指定行 Case Else PIN = wsTarget.Cells(i, 7).Value If PIN <> "" Then ' 仅执行一次查找,结果存入变量 Set foundPin = wsSource.Range("G:G").Find( _ What:=PIN, _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ MatchCase:=True _ ) ' 判断是否找到匹配项(关键:检查对象是否存在) If Not foundPin Is Nothing Then status = wsSource.Cells(foundPin.Row, 33).Value ' 对比状态值,不同则更新 If status <> wsTarget.Cells(i, 33).Value Then wsTarget.Cells(i, 33).Value = status ' 修改行格式 With wsTarget.Range(wsTarget.Cells(i, 1), wsTarget.Cells(i, 38)).Interior ' 在这里添加你的格式修改代码,例如: ' .Color = RGB(255, 255, 0) ' 设置黄色背景 End With End If End If End If End Select Next i ' 按需关闭数据源工作簿(根据需求调整SaveChanges参数) wbData.Close SaveChanges:=False Application.ScreenUpdating = True
关键优化点说明
- 用变量存储Find结果:避免重复调用
Find,提升效率同时保证结果一致;通过Not foundPin Is Nothing判断是否找到匹配项,彻底解决错误91。 - 去掉Activate/Select:直接通过工作表对象(
wsTarget/wsSource)操作单元格,避免因激活状态变化导致的意外错误,代码更稳定。 - 明确工作表引用:一定要把
wsSource = wbData.Sheets("Sheet1")里的"Sheet1"替换成你test.xlsx中实际存储数据的工作表名称,否则会找不到目标数据。
内容的提问来源于stack exchange,提问作者D. R. M. Smith
相关产品推荐
相关产品推荐

