如何解决这段VBA代码中的‘Object Required’编译错误?
问题分析与修复
核心错误原因
- 非对象变量误用
Set关键字:x是数值型变量,函数Refill的返回值也是数值,不能用Set赋值,直接去掉Set即可。 - 对象类型定义错误:
Find和FindNext返回的是Range对象,不是通用Object,应将search、search1、search2定义为Range类型。 - 循环逻辑漏洞:当找不到下一个匹配项时,
search1会变成Nothing,此时访问search1.Row会触发错误;同时原循环没有正确的终止条件,容易陷入死循环或提前退出。
修复后的代码
Function Refill() As Long Dim x As Long Dim rg As Range Dim search As Range Dim firstMatch As Range x = 0 Refill = 0 Set rg = ThisWorkbook.ActiveSheet.Range("F:F") ' 明确指定工作表,避免歧义 Set search = rg.Find(What:="YES", LookIn:=xlValues, LookAt:=xlWhole) ' 明确查找参数,避免默认值问题 If Not search Is Nothing Then Set firstMatch = search ' 记录第一个匹配的单元格,用于判断循环是否回到起点 x = 1 Do Set search = rg.FindNext(search) ' 检查是否回到第一个匹配项,或者找不到下一个了 If search Is Nothing Or search.Address = firstMatch.Address Then Exit Do x = x + 1 Loop Refill = x End If End Function
关键优化点
- 明确指定
Find的参数(LookIn、LookAt),避免依赖Excel默认设置导致的查找偏差。 - 记录第一个匹配的单元格地址,通过地址判断是否循环回到起点,比用Row更可靠(同一行可能有多个匹配,或者不同行但循环回到起点)。
- 变量类型改为
Long(适合计数场景,比Variant更高效)。 - 明确指定工作表(
ThisWorkbook.ActiveSheet),避免在不同工作表切换时出现错误。
内容的提问来源于stack exchange,提问作者ogiepogie
相关产品推荐
相关产品推荐

