VBA查找替换偏移值代码报错:运行时错误91问题求助
解决VBA运行时错误91:对象变量或With块变量未设置
错误根源
当Range.Find在目标工作表B列找不到匹配值时,会返回Nothing,此时直接执行fnd.Offset(0, 31).Value = ...就会触发错误91——因为你在操作一个未初始化的对象。
另外你的代码还有几个冗余/无效问题:
Set Search = .Range("A5")只指定了单个单元格,For Each cel In Search的循环完全没必要,应该改成遍历A列需要处理的连续数据区域- 定义了
wsMaster和fndFirst变量,但全程未使用,属于冗余代码
修复后的代码
Sub Replace_List() Dim cel As Range Dim fnd As Range Dim wbToCheck As Workbook Dim wsInput As Worksheet ' 提前定义工作表对象,避免重复引用 Set wsInput = ThisWorkbook.Sheets("RAG Data Input") ' 先尝试获取目标工作簿,避免因文件未打开报错 On Error Resume Next Set wbToCheck = Workbooks("Test CP6 Y5 New Kent Sussex Possession Minutes - New Version") On Error GoTo 0 ' 检查目标工作簿是否存在 If wbToCheck Is Nothing Then MsgBox "目标工作簿未打开,请先打开对应文件!", vbExclamation Exit Sub End If Application.ScreenUpdating = False ' 遍历A5到A列最后一行有数据的单元格 For Each cel In wsInput.Range("A5", wsInput.Cells(wsInput.Rows.Count, "A").End(xlUp)) ' 跳过空单元格,减少无效查询 If cel.Value <> "" Then Set fnd = wbToCheck.Worksheets("Sheet1").Range("B:B").Find(What:=cel.Value, LookAt:=xlWhole) ' 核心修复:先判断是否找到匹配项,再执行赋值 If Not fnd Is Nothing Then fnd.Offset(0, 31).Value = wsInput.Range("O1980").Value End If End If Next Application.ScreenUpdating = True MsgBox "替换完成", vbInformation, "操作结束" End Sub
关键修改点
- 新增目标工作簿存在性检查:避免因目标文件未打开导致的额外报错
- 修正遍历范围:改成从A5到A列最后一行有数据的单元格,让循环真正发挥作用
- 新增空单元格跳过逻辑:避免对空单元格执行无效查询
- 核心错误修复:调用
fnd.Offset前,先通过If Not fnd Is Nothing Then判断是否找到匹配项,仅在找到时执行赋值操作,彻底规避错误91
内容的提问来源于stack exchange,提问作者MJobbson
相关产品推荐
相关产品推荐

