Excel VBA Range.Find() 方法可以用来查找第一个值为指定内容的单元格,可以设置匹配方式为部分匹配或全部匹配,Range.Find 查找的内容如果刚好存在于并且只存在于区域内的第一个单元格内,Range.Find 不会如实返回第一个单元格,而是返回 Nothing,Range.Find 会自动记住设置过的参数值,下一次调用 Range.Find 时,即使没有指定参数值,VBA 仍然会使用上一次设置的值,而不是使用参数的默认值,或者准确地说,这些参数压根没有默认值,但他们又是可选参数,这个设计简直是脑残到家了,在 VBA 众多的脑残设计中堪称顶级脑残设计。
Excel VBA Range.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) 参数的详细解释。
What 必选参数,是要查找的值,匹配的是单元格的实际储存值,而不是显示值,比如在单元格格式为日期的单元格中查找,只能按数值查找,因为日期在 Excel 内部以数值存储,而不是按显示的字符串存储,需要先进行数据转换再查找。
除了 What 其它参数都是可选参数。
After,在这个单元格后查找,是一个用 Range 对象表示的单一单元格,不指定时是区域内最左上方的单元格,这个单元格不参与搜索,将 After 的值设置为区域内最后一个单元格可以避免第一个单元格匹配却无法返回的问题,最后一个单元格匹配也能正常返回,这是一个有用的小技巧。
LookIn,在哪里查找,值可以是这些值之一:xlFormulas 在单元格公式字符串里面查找 xlValues 在单元格的最终运算值里面查找 xlComments 在批注里面查找 xlCommentsThreaded 在对话式批注里面查找。
LookAt,匹配方式,值可以是这两个值之一:xlPart 允许部分匹配 xlWhole 必须完整匹配。如果查找 abc,abcd 在部分匹配时能匹配成功,在完整匹配时匹配失败。
SearchOrder,查找顺序,值可以是这两个值之一:xlByColumns 先上下再左右 xlByRows 先左右再上下,先上还是先下先左还是先右取决于 SearchDirection。
SearchDirection,查找过程中的移动方向,值可以是这两个值之一:xlNext 顺序移动,即往右或往下移动 xlPrevious 逆序移动,即往左或往上移动。
MatchCase, 是否匹配大小写,TRUE 代表匹配大小写,FALSE 代表忽略大小写,默认值为 FALSE,不会自动记忆。
MatchByte, 是否全角匹配,TRUE 代表全角匹配,全角字符和半角字符视作不同的字符,FALSE 代表禁止全角匹配,全角字符和半角字符视作相同的字符,默认值是 TRUE,不会自动记忆。
SearchFormat,是否要求单元格格式符合设置的规则,TRUE 代表是 FALSE 代表否,默认值为 FALSE,不会自动记忆,这个参数官方文档完全没有提到,VBA 编辑器中将这个参数的类型标记为 Range,再次体现了 VBA 的不严谨,实际上这个参数值为 TRUE 时,只有具有指定单元格格式的单元格才会匹配成功,而对查找过程中单元格格式的要求需要在调用 Range.Find 前使用 Application.FindFormat 来设置。- Application.FindFormat.Font.Bold = True
复制代码 Range.Find SearchFormat 在对单元格格式有要求时非常有用,以上设置让只有单元格格式有加粗样式并且和 What 参数指定的值匹配的单元格才能被找到并且返回。
最后,需要指出的是,Range.Find 查询并且以 Range 对象返回第一个符合条件的单元格,它返回的是一个对象,而不是一个字符串或数字等标量数据,但是 VBA 有一个非常臭名昭著的脑残设计是它会自动调用对象的默认属性,而 Range 对象的默认属性是 Value,因此需要特别注意的是要避免 Range 对象被偷偷摸摸地转换成 Range.Value 也就是单元格的值。 |
|