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

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

关键优化点说明

  1. 用变量存储Find结果:避免重复调用Find,提升效率同时保证结果一致;通过Not foundPin Is Nothing判断是否找到匹配项,彻底解决错误91。
  2. 去掉Activate/Select:直接通过工作表对象(wsTarget/wsSource)操作单元格,避免因激活状态变化导致的意外错误,代码更稳定。
  3. 明确工作表引用:一定要把wsSource = wbData.Sheets("Sheet1")里的"Sheet1"替换成你test.xlsx中实际存储数据的工作表名称,否则会找不到目标数据。

内容的提问来源于stack exchange,提问作者D. R. M. Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:14:36