Excel VBA For循环内Range.Find查找结果地址不更新问题
问题原因
VBA的Range.Find方法存在参数记忆特性:所有可选查找参数会自动保留上一次调用(包括Excel界面手动查找操作)的设置,不会自动恢复默认值。
你的代码调用Find时仅传入了待查找值参数,未显式指定匹配规则、查找范围类型等核心参数,导致后续循环的查找规则被第一次查找的留存设置覆盖,始终返回第一次匹配到的单元格地址,无法正确定位后续序号。
另外你的代码还存在三个隐性问题:
- 取分区总数时读取的是
resourceFees工作表的辅助列,但查找时用的是ActiveSheet(当前活动表),如果运行宏时活动表不对,会直接找错范围 - 未判断Find是否成功找到目标单元格,遇到序号缺失时会直接抛出空对象错误
- 用
Select+Selection的写法操作单元格,稳定性差、运行效率低
修正方案
- 每次调用Find时显式指定所有核心参数,固定查找规则:
LookIn:=xlValues(按单元格显示值查找)、LookAt:=xlWhole(全单元格精确匹配,避免部分匹配错误)、SearchOrder:=xlByRows(按行搜索)、SearchDirection:=xlNext(向后搜索) - 统一指定操作工作表为
resourceFees,移除ActiveSheet的不稳定写法 - 删除冗余的Select操作,直接通过FoundCell对象操作目标范围
- 增加FoundCell空值判断,避免序号缺失时程序崩溃
修正后完整代码
Sub Macro3() ' 绑定操作工作表 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("resourceFees") ' 获取分区总数 Dim sectionNum As Integer sectionNum = WorksheetFunction.Max(ws.Range("sectionHelper")) Dim i As Integer Dim What_to_find As Integer Dim FoundCell As Range What_to_find = 1 For i = 1 To sectionNum ' 显式指定所有查找参数,规避参数记忆导致的查找异常 Set FoundCell = ws.Range("B:B").Find( _ What:=What_to_find, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext _ ) ' 成功定位到目标单元格才执行清除、格式设置操作 If Not FoundCell Is Nothing Then With FoundCell.Offset(0, 3).Resize(1, 14) .Clear .Interior.Color = RGB(146, 205, 220) End With End If What_to_find = What_to_find + 1 Next i End Sub
注:如果你的辅助列
sectionHelper不在B列,把代码里ws.Range("B:B")替换为辅助列对应的实际列范围即可。
内容的提问来源于stack exchange,提问作者Ashterix
相关产品推荐
相关产品推荐

