微信公众号 【EXCEL880】 QQ群【341401932】
课程咨询 加我微信EXCEL880B 试学网址http://v.excel880.com
课程咨询 加我微信EXCEL880B 试学网址http://v.excel880.com
-
本技巧的目的:在EXCEL 中通过 CTRL + F 或者通过 菜单栏中的查找, 查找到指定内容的单元格。今天主要介绍使用VBA来查找的方法。
-
1. 使用代码助手快速调取 FIND 和 LIKE 的方法
-
输入 FIND 空格 可快速调出 FIND 语句:里面有详细的注释,如何输入代码。 代码助手还支持自己根据需要定义,收录自己所需的代码。
-
-
Like 空格 同样可以得到代码助手的提示。
-
-
2. FIND 方法详细说明
-
1. 录制宏获取代码
-
查找 B1 : B14 区域中 编号为 262101 的单元格
-
★★★注意:查找方法要录取到代码, 一定要点击:查找下一个, 然后关闭。点击二次可以得到 查找下一个 的相应代码。
-
如果只点击:查找全部,然后关闭, 会出现这种没有录制到 FIND 代码的情况。如下图:
-
-
正确录制到的代码:
-
-
代码:
-
Range("B1:B14").Select Selection.Find(What:="262101", After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate Selection.FindNext(After:=ActiveCell).Activate
-
注释:
-
第一次点击 查找下一个,录制到的代码为:FIND 方法
-
不关闭 查找 对话框,第二次点击 查找下一个,录制到的为:Findnext 方法
-
① 只有在运行过 FIND 方法后,才能使用本方法。
-
② 查找下一个,到未尾后将回到开始位置继续搜索。
-
③ 为防止死循环,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同的方法来选择是否退出循环。
-
FIND 方法参数详细说明:
-
① 必须输入项: What 需要搜索的内容,字符串或者任意类型
-
以下均为 可以不输入,使用默认值的参数, 根据需要输入。
-
② After 从该单元格之后开始后开始查找,如果不写,从查找区域的左上角之后开始查找。
-
③ LookIn 3种信息类型。xlComments:批注 xlFormulas: 公式 xlValues: 值
-
④ LookAt 二种: xlWhole:完全匹配 或 xlPart:部分匹配:即任一部分搜索文本
-
⑤ SearchOrder 二种:
-
xlByRows: 先将一行搜索完毕,再移到下一行进行搜索
-
xlByColumns:先将一列搜索完毕,再移到下一列进行搜索
-
⑥ SearchDirection 搜索方向: xlNext 搜索下个一匹配值 xlPrevious 搜索上一匹配值。
-
⑦ MatchCase: 是否区分大小写 True:区分,False:不区分。默认值为 False。
-
⑧ MatchByte: 基本不使用,是否匹配全角半角 True: 匹配 False 不匹配
-
⑨ SearchFormat: 基本不使用,搜索内容的格式,如:字体、边框等等。
-
根据以上内容可将代码修改成:
-
-
代码:
-
Set rng = Range("B1:B14").Find(What:="262101", LookAt:=xlPart, MatchByte:=False)
-
' 设置为变量 rng : 搜索 B1 : B14 区域, 条件为 "26101" , 部分匹配: 任一部分搜索文本 , 全角半角都匹配
-
If Not rng Is Nothing Then '如果 rng 不为空
-
c = rng.Address '记录第一次的地址
-
Debug.Print c & "第1次" '调试语句, 打印地址
-
k = 1 '计数, 为了调试用
-
Do
-
k = k + 1 '每查找到一次, 计数器 +1 , 为了调试用
-
Set rng = Range("B1:B14").FindNext(rng) '下一次查找
-
Debug.Print rng.Address & "第" & k; "次" '调试语句, 打印地址
-
Loop While Not rng Is Nothing And rng.Address <> c
-
' 如果对象不为空且地址不等于第1次记录的地址, 则退出循环
-
End If
-
注释: 图片中立即窗口的查找结果, 当代码执行到第四次查找到第1次的地址后, While 判断语句生效退出循环。
-
-
3. Like 方法详细说明
-
like 语句 可以使用通配符进行复杂的查找,先看下图:
-
-
代码:
-
With Sheet1
-
'位置语句: Sheet1
-
.Range("G:G").ClearContents
-
' 清除 G 列原数据, Clearcontents: 只清除数据,保留格式
-
Set 最大行 = .Range("F60000").End(xlUp) '最大行号
-
For Each rng In .Range("F2:F" & 最大行.Row)
-
' F2 到 F 最大行 单元格循环
-
If rng.Value Like "[李叶王]*" Then '如果有相符的值
-
k = k + 1 '计数器 +1
-
.Range("G" & k).Value = rng.Value '在G列输出相符的值
-
End If
-
Next
-
End With
-
注释:
-
代码中使用了位置语句 With。在 With 和 End With 之间,需要使用该地址的位置前加上 . 代表使用上面的位置
-
首先要清除需要输出区域的原数据,这个区域以不影响需要保留数据的单元格为原则,可适当放大区域。
-
like 语句 与 * 搭配, 如图例是匹配 以 李、叶、王 开头,后面多个文字的名字
-
如果 与 ? 搭配,如下图匹配 以 李、叶、王 开头,后面 1 个文字的名字,如下图:
-
-
pattern中的字符 符合string中的字符
-
? 任何单一字符
-
* 零个或多个字符
-
-
结论:BAT123khg like B?T* 匹配: 结果正确
-
-
结论:CAT123khg like B?T* 匹配: 结果错误
-
# 任何一个数字 (0–9)
-
-
结论:1 like # 匹配: 结果正确
-
[charlist] charlist中的任何单一字符
-
★★★注意:大小写要相同才能正确匹配
-
-
结论: f like [a-z] 匹配: 结果正确
-
-
结论: f like [A-Z] 匹配: 结果错误[!charlist] 不在charlist中的任何单一字符
-
-
结论:f like [!a-z] 匹配: 结果错误
-
-
'更多作品请百度搜索 郑广学