VBA Find方法跨工作表按钮运行查找日期报错解决
VBA Range.Find查找日期跨工作表触发报错解决
问题现象
- 待查找的数据源存放在
ws1工作表,宏触发按钮放在Engine工作表 - 选中
ws1工作表时直接从VBA模块运行宏,代码可以正常执行无报错 - 点击
Engine工作表上的按钮触发宏时,查找逻辑直接抛出运行错误 - 试过在查找代码前加
ws1.Activate激活目标工作表,没有解决问题 - 已知条件:
Engine工作表C7单元格是日期类型,值为4/1/2022
出问题的原始代码
Set myr = ws1.Range("A:A").Find(ThisWorkbook.Sheets("Engine").Range("C7").Value, after:=ws1.Cells(1, 1), searchdirection:=xlNext)
问题原因
Range.Find方法如果不手动指定LookIn参数,会直接沿用Excel里最近一次手动查找的设置,这个设置是和当前激活的工作表绑定的,就算代码里写了Activate激活工作表,也不会重置这个默认查找参数。
日期在单元格里底层存的是数值序列,表面显示的是格式化后的日期文本,从Engine工作表点按钮触发宏时,默认继承的LookIn参数是匹配单元格显示值的xlValues,和传入的日期类型值无法匹配,最终触发报错。
修复方法
用Range.Find查找日期类型值时,必须显式加上LookIn:=xlFormulas参数,直接匹配单元格底层存储的内容,不要依赖默认的查找参数。
修复后可正常运行的代码
Set myr = ws1.Range("A:A").Find(ThisWorkbook.Sheets("Engine").Range("C7").Value, after:=ws1.Cells(1, 1), LookIn:=xlFormulas, _ LookAt:=xlPart, searchdirection:=xlNext)
实用提示:所有调用
Range.Find的场景都建议显式写全LookIn、LookAt、SearchDirection这类核心参数,避免因为用户手动改了查找设置,导致宏出现偶发找不到值、报错的问题。
内容的提问来源于stack exchange,提问作者34653120
相关产品推荐
相关产品推荐

