VBA使用Range.Find方法触发Run-Time Error 91错误无法解决求助
报错根源分析
- 核心触发原因:
Find方法未在目标区域找到匹配值时会返回Nothing,你未做非空判断就直接访问返回对象的Row/Column属性,触发运行时错误91。除了你报错的OTc行,前面OTr的Find如果没匹配到Employeecm.Text也会触发同样的报错。 - 隐藏隐患1:VBA 不支持一行声明多个同类型变量,你写的
Dim OTr, OTc As Range实际只有OTc是Range类型,OTr默认是Variant类型,存在类型不匹配风险。 - 隐藏隐患2:后续条件判断
If WS.Cells(OTr.Row, OTc.Column + 2) = "a" And "b" And "c" Then语法完全错误,VBA不支持连续等值判断的简写,且你此处逻辑应该为「或」而非「且」。
修复后的完整代码
Private Sub InputCMBT_Click() ' 每个变量单独声明类型 Dim OTr As Range, OTc As Range Dim OTr2 As Range, OTc2 As Range Dim WS As Worksheet, PCMB As Variant Set WS = Worksheets("OT") ' 匹配员工名称,增加未找到判断 Set OTr = WS.Range("a3:a36").Find(Employeecm.Text, lookat:=xlWhole, SearchOrder:=xlByRows) If OTr Is Nothing Then MsgBox "未找到匹配的员工名称:" & Employeecm.Text, vbExclamation Exit Sub End If MsgBox OTr.Row ' 匹配日期,增加未找到判断 Set OTc = WS.Range("c2:dc2").Find(DateworkTB, lookat:=xlWhole, SearchOrder:=xlByColumns) If OTc Is Nothing Then MsgBox "未找到匹配的日期:" & DateworkTB, vbExclamation ' 此处如果是日期匹配失败,可确认目标单元格格式是否和DateworkTB格式一致 Exit Sub End If MsgBox OTc.Column ' 赋值逻辑 If WS.Cells(OTr.Row, OTc.Column) = "" Then WS.Cells(OTr.Row, OTc.Column) = OvertimeTB.Value WS.Cells(OTr.Row, OTc.Column + 2) = ShiftCBB.Text Else WS.Cells(OTr.Row, OTc.Column).Clear WS.Cells(OTr.Row, OTc.Column + 2).Clear WS.Cells(OTr.Row, OTc.Column) = OvertimeTB.Value WS.Cells(OTr.Row, OTc.Column + 2) = ShiftCBB.Text End If ' 修复条件判断语法和逻辑 Select Case WS.Cells(OTr.Row, OTc.Column + 2).Value Case "a", "b", "c" WS.Cells(OTr.Row, OTc.Column + 1) = 7 Case "M", "N" WS.Cells(OTr.Row, OTc.Column + 1) = 10.5 Case Else WS.Cells(OTr.Row, OTc.Column + 1) = 8 End Select End Sub
关键修改说明
- 修正了变量声明规则,每个变量明确指定类型,避免隐式Variant带来的未知错误
- 所有
Find方法执行后都增加了Is Nothing的判断,匹配失败直接弹出提示终止流程,不会触发91报错 - 把错误的多条件判断改成了
Select Case写法,逻辑更清晰也不会出现语法错误 - 针对日期匹配失败的场景,可以根据弹出的提示确认
DateworkTB的值和目标区域C2:DC2的单元格格式是否一致,日期格式不匹配是Find失败的常见原因
内容的提问来源于stack exchange,提问作者Wipawee Petto
相关产品推荐
相关产品推荐

