Excel VBA自动化数据录入时出现Runtime Error 91问题求助
搞定VBA里的Runtime Error 91:查找区域报错的问题
嘿,我看你在做Excel VBA自动化数据录入时碰到了Runtime Error 91,特别是在查找AF3:AF30区域的时候对吧?这个问题其实挺常见的,咱们一步步拆解解决。
首先得搞清楚:Error 91本质是你试图访问一个不存在的对象的属性——当Range.Find没找到匹配值时,它会返回Nothing,这时候你直接调用.Address()肯定会炸。之前用B2:AD2没问题,只是因为那个区域总能找到你要的内容,而AF3:AF30总会出现找不到的情况,再加上代码里还有个小逻辑漏洞,就触发错误了。
你的代码里的两个核心问题:
- 没处理Find找不到的情况:不管哪个区域,只要Find返回
Nothing,直接调用.Address()必报错,只是之前B2:AD2运气好没碰到而已。 - Search变量的赋值逻辑有问题:第二个
ElseIf分支里你用了Search,但这个变量只有在第一个If分支(判断A开头的情况)才会被赋值。如果直接进入第二个分支,Search是空的,Find自然找不到东西,直接触发错误。
修复后的代码(附详细说明):
Sub AutoFill() ' 别用Select了,直接操作Range更高效稳当 Worksheets("Pallet Check").Range("B8:AD57").ClearContents Dim Rng As Range, cell As Range Set Rng = Worksheets("Avon Trailer List").Range("E4:E38") Dim temp As String, tempa As Variant, i As Integer Dim strInput As Range ' 用Range对象存Find结果,方便判断是否找到 Dim lnRow As Long, strCol As String Dim Search As String For Each cell In Rng temp = Replace(cell.Value, " ", "") temp = Replace(temp, "+", "") If temp = "" Then Exit For Else strCol = "" ' 每次循环重置strCol,避免上次的残留值搞事情 tempa = SplitMultiDelims(temp, "/,\)(") For i = 0 To UBound(tempa) ' 先跳过空的拆分结果,省得做无用功 If Trim(tempa(i)) = "" Then GoTo NextIteration ' 判断A开头的情况,忽略大小写更灵活 If InStr(1, tempa(i), "A", vbTextCompare) = 1 Then ' 明确Find的参数,避免默认值坑你(比如默认是部分匹配) Set strInput = Worksheets("Pallet Check").Range("B2:AD2").Find( _ What:=tempa(i), LookIn:=xlValues, LookAt:=xlWhole) ' 先判断有没有找到,再操作属性! If Not strInput Is Nothing Then lnRow = strInput.Row strCol = Left(strInput.Address, Len(strInput.Address) - Len(CStr(lnRow))) strCol = Replace(strCol, "$", "") ' 原代码的"S"应该是笔误吧?去掉单元格地址里的$符号 Search = tempa(i) Else ' 可选:找不到时提示一下,或者直接跳过 MsgBox "在B2:AD2里没找到 " & tempa(i) End If ' 处理A/B不在开头的情况,同样忽略大小写 ElseIf InStr(1, tempa(i), "A", vbTextCompare) > 1 Or _ InStr(1, tempa(i), "B", vbTextCompare) > 1 Then ' 这里先把当前tempa(i)赋值给Search,再去查找! Search = tempa(i) Set strInput = Worksheets("Pallet Check").Range("AF3:AF30").Find( _ What:=Search, LookIn:=xlValues, LookAt:=xlWhole) If Not strInput Is Nothing Then lnRow = strInput.Row Worksheets("Pallet Check").Range("AH" & lnRow).Value = "(" & tempa(i) & ")" Else MsgBox "在AF3:AF30里没找到 " & Search End If ' 处理其他非空情况 Else ' 确保strCol已经被赋值,避免空值报错 If strCol <> "" Then With Worksheets("Pallet Check").Range(strCol & (tempa(i) + 7)) .Value = .Value & tempa(i) End With End If End If NextIteration: Next i End If Next cell End Sub
重点优化的地方:
- 用Range对象存Find结果:这样可以用
If Not strInput Is Nothing直接判断是否找到,彻底避免Error 91。 - 明确Find的参数:默认的
LookAt是xlPart(部分匹配),我改成了xlWhole(精确匹配),你可以根据自己的需求调整。 - 修复Search的赋值逻辑:在第二个分支里先给Search赋值,再去查找,不会再用空值去搜了。
- 删掉Select操作:VBA里用Select不仅慢,还容易因为选中区域变化出问题,直接操作Range才是正确姿势。
- 忽略大小写判断:用
vbTextCompare一次搞定大小写,不用写四次判断,代码更简洁。 - 跳过空拆分结果:避免对空值做无效处理,减少出错概率。
额外提醒:
- 记得确认你的
SplitMultiDelims自定义函数逻辑是对的,这个函数是你用来多分隔符拆分的,要是它出问题也会影响后续流程。 - 如果不需要弹窗提示,可以把
MsgBox换成日志记录或者直接跳过,看你自己的需求来。
内容的提问来源于stack exchange,提问作者Dman
相关产品推荐
相关产品推荐

