VBA中的Find方法相当于我们在工作表中的查找功能。
- Find的语法是:
<单元格区域>.Find (What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])
[参数说明]
(1)<单元格区域>,必须指定,返回一个Range对象。
(2)参数What,必需指定。代表所要查找的数据,可以为字符串、整数或者其它任何数据类型的数据。对应于“查找与替换”对话框中,“查找内容”文本框中的内容。
(3)参数After,可选。指定开始查找的位置,即从该位置所在的单元格之后向后或之前向前开始查找(也就是说,开始时不查找该位置所在的单元格,直到Find方法绕回到该单元格时,才对其内容进行查找)。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。
(4)参数LookIn,可选。指定查找的范围类型,可以为以下常量之一:xlValues、xlFormulas或者xlComments,默认值为xlFormulas。对应于“查找与替换”对话框中,“查找范围”下拉框中的选项。
(5)参数LookAt,可选。可以为以下常量之一:XlWhole或者xlPart,用来指定所查找的数据是与单元格内容完全匹配还是部分匹配,默认值为xlPart。对应于“查找与替换”对话框中,“单元格匹配”复选框。
(6)参数SearchOrder,可选。用来确定如何在单元格区域中进行查找,是以行的方式(xlByRows)查找,还是以列的方式(xlByColumns)查找,默认值为xlByRows。对应于“查找与替换”对话框中,“搜索”下拉框中的选项。
(7)参数SearchDirection,可选。用来确定查找的方向,即是向前查找(XlPrevious)还是向后查找(xlNext),默认的是向后查找。
(8)参数MatchCase,可选。若该参数值为True,则在查找时区分大小写。默认值为False。对应于“查找与替换”对话框中,“区分大小写”复选框。
(9)参数MatchByter,可选。即是否区分全角或半角,在选择或安装了双字节语言时使用。若该参数为True,则双字节字符仅与双字节字符相匹配;若该参数为False,则双字节字符可匹配与其相同的单字节字符。对应于“查找与替换”对话框中,“区分全角/半角”复选框。
(10)参数SearchFormat,可选,指定一个确切类型的查找格式。对应于“查找与替换”对话框中,“格式”按钮。当设置带有相应格式的查找时,该参数值为True。
(11)在每次使用Find方法后,参数LookIn、LookAt、SearchOrder、MatchByte的设置将保存。如果下次使用本方法时,不改变或指定这些参数的值,那么该方法将使用保存的值。
在VBA中设置的这些参数将更改“查找与替换”对话框中的设置;同理,更改“查找与替换”对话框中的设置,也将同时更改已保存的值。也就是说,在编写好一段代码后,若在代码中未指定上述参数,可能在初期运行时能满足要求,但若用户在“查找与替换”对话框中更改了这些参数,它们将同时反映到程序代码中,当再次运行代码时,运行结果可能会产生差异或错误。若要避免这个问题,在每次使用时建议明确的设置这些参数。
其参数有很多,但没必要都记住,知道参数what是查找的内容,参数lookat是模糊查找还是精确查找就可以了。
- 假如要在A列精确查找是‘小明’的单元格,Find返回的是一个单元格对象,因此要用Set语句。如果能找到得到小明这个单元格,则Rng对象就不再是Nothing(什么也木有),可以用Not....Nothing表示(找到了),这可以用来判断,如入库单单号,是否在数据区(找得到)等。
Sub findd()'精确查找
Dim Rng As Range
Set Rng = Range("a:a").Find(what:="小明", lookat:=xlWhole)
End Sub
'模糊查找,A列含有‘小明’这个字符的单元格。
Set Rng = Range("a:a").Find(what:="小明", lookat:=xlpart)
-
通常,Find方法只能查找到第一个或者最后一个匹配的单元格,视乎查找方向而定。我们也可以通过Find方法返回单元格所在的行号,用来搞点神马事情,这样的好处是不需要循环确定,效率会稍高。
练习1:在A1:A10判断单据号码8是否已经存在。
Sub GG()
Dim Rng As Range
Set Rng = Range("a1:a10").Find(what:="8", lookat:=xlWhole)
If Not Rng Is Nothing Then
MsgBox "单据号码已存在,请勿XXXXxx"
Else
MsgBox "单据号码不存在"
End If
End Sub
- 要想用Find查找全部的数据,就要使用FindNext或FindPrevious方法配合。
- 练习2:删除指定组别是7的所有数据。
Sub 删除行1()
Dim Rng As Range
Application.ScreenUpdating = False '关闭屏幕刷新
'查找组别7的单元格
'Set rng = Range("b:b").Find(what:="7") '默认模糊查找
Set Rng = Range("b:b").Find(what:="7", lookat:=xlWhole) '精确查找
Do Until Rng Is Nothing '查找不到组别7就退出循环
Rng.EntireRow.Delete '组别7单元格的整行删除
Set Rng = Range("B:B").FindNext '查找下一个组别7
Loop
Application.ScreenUpdating = True '开启屏幕刷新
End Sub