生活中有许多怪现象,例如,我就经常碰到这样的事情,当我想要某件东西时,找半天也总是找不到,可不想要它时,却冒了出来,你说气不气人! 找东西绝不是一件有趣的事儿!
Excel考虑得很周全,为你准备了查找功能,能够在大量的工作表数据中找出特定的数据。下面的图演示了我们在Excel中常用的查找操作:
在图示工作表中,我们要查找内容为“1”的单元格,在“查找与替换”对话框的“查找内容”中输入“1”,单击“查找全部”按钮,即可显示所查找到的详细信息,并且工作表中会选择查找到的第一个单元格。 如果单击对话框中“查找下一个”按钮,那么活动单元格会在查找到的单元格中循环移动。
我们来看看宏录制器录制上述操作后生成的代码。如果仅单击“查找全部”按钮,宏录制器不会生成任何代码,只有当单击“相找下一个”按钮时,宏录制器才会录制代码。我单击了“查找下一个”按钮三次,即依次选择包含“1”的单元格A1、D2、B3。录制的代码如下:
Sub 宏5() ' ' 宏5 宏 '
' Cells.Find(What:='1',After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows,SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False,SearchFormat:=False).Activate Cells.FindNext(After:=ActiveCell).Activate Cells.FindNext(After:=ActiveCell).Activate End Sub
与录制的操作相对照,分析录制的代码。Find方法负责在工作表单元格区域中执行查找,FindNext方法向指定的单元格后继续进行查找。
可以看到,Find方法有很多参数,部分参数所对应的含义如下图所示。
仍然以上面所示的工作表为例,自已编写代码,查找单元格内容为“1”的单元格并显示地址。代码如下: Sub testFind1() Dim rng As Range
Set rng =Range('A1:D3').Find(What:='1') MsgBox '查找到内容为1的单元格为: '& rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) End Sub 运行代码后的结果如下图所示。 可以看到,虽然内容为“1”的单元格有A1、D2、B3三个,但只显示查找到单元格D2。
现在,我们指定Find方法的参数SearchOrder为按列查找(xlByColumns),代码如下: Sub testFind2() Dim rng As Range
Set rng =Range('A1:D3').Find(What:='1', SearchOrder:=xlByColumns) MsgBox '查找到内容为1的单元格为: '& rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) End Sub 运行代码后,将返回单元格B3。因此,如果不指定参数SearchOrder,将默认按行查找,所以上例查找到的单元格为D2。 并且,由于我们没有指定参数After,默认为从单元格区域的左上角即单元格A1开始搜索。我们可以看到,虽然单元格A1包含内容“1”,但按行或按列查找均没有显示找到的单元格是A1。因此,Find方法是在参数After指定的单元格或默认的起始单元格之后开始进行搜索的。
接下来再看示例。如下图所示的工作表。 我们要在单元格区域A1:B4查找内容为“雾”的单元格,代码如下: Sub testFind3() Dim rng As Range
Set rng =Range('A1:B4').Find(What:='雾') MsgBox '查找到内容为[雾]的单元格为: '& rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) End Sub 运行代码后,返回的单元格为A2。为什么会得到这个结果呢?为什么不是单元格B1或B3。原因为:
Sub testFind4() Dim rng As Range
Set rng =Range('A1:B4').Find(What:='雾',LookAt:=xlWhole) MsgBox '查找到内容为[雾]的单元格为: '& rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) End Sub 运行代码后,将返回单元格B3,即完全与所查找内容相匹配的单元格。
通过学习和试验上面的例子后,我们不难理解Find方法的语法。 Find方法的语法如下: Range对象.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat) 说明:
因此,每次使用该方法时,建议明确地设置这些参数的值。
下面是FindNext方法的语法: Range对象 .FindNext(After) 其中,参数After指定一个单元格,搜索将从该单元格之后开始。如果没有指定该参数,则从单元格区域左上角的单元格之后开始搜索。当搜索到单元格区域末尾时,将返回到单元格区域开始重新搜索。这些特征都与Find方法一样。
正如上文所指出的,FindNext方法让我们能够查找到单元格区域中所有与查找内容相符的单元格。以本文开头的工作表为例,查找单元格区域A1:D3中包含内容“1”的所有单元格,并将其背景设置为红色。 代码如下: Sub testFind5() Dim rng As Range '声明对象变量 Dim firstRng As String '声明字符串变量用来存放变量地址
'将查找到的第一个单元格赋值给变量 Set rng =Range('A1:D3').Find(What:='1', LookIn:=xlValues)
'判断是否找到了单元格 If Not rng Is Nothing Then '若找到,则将其地址保存到变量中 firstRng = rng.Address Do '给找到的单元格设置红色背景色 rng.Interior.ColorIndex = 3 '查找下一个单元格 Set rng =Range('A1:D3').FindNext(After:=rng) '如果找到单元格并且不是最先找到的单元格,则继续循环操作 Loop While Not rng Is Nothing Andrng.Address <> firstRng End If End Sub 代码运行结果如下图所示:
在代码中已进行了详细的注释,可以帮助你理解,并且在《Excel VBA解读(16):VBA的运算符》中介绍了Is运算符,用于对象变量的判断,可参阅。 这段代码给出了查找多个单元格的框架,在很多实用程序中都可借鉴,建议详细研究理解。
与FindNext方法相似,也可以使用FindPrevious方法实现连续查找。与FindNext方法不同的是,FindPrevious方法从指定的单元格之前开始查找,一直到单元格区域的开头后,再从单元格区域的结尾开始向开头方向查找。 下面的代码实现与上例相同的功能,只是单元格添加背景色的顺序不同: Sub testFind6() Dim rng As Range '声明对象变量 Dim firstRng As String '声明字符串变量用来存放变量地址
'将查找到的第一个单元格赋值给变量 Set rng =Range('A1:D3').Find(What:='1', LookIn:=xlValues)
'判断是否找到了单元格 If Not rng Is Nothing Then '若找到,则将其地址保存到变量中 firstRng = rng.Address Do '给找到的单元格设置红色背景色 rng.Interior.ColorIndex = 3 '查找下一个单元格 Set rng =Range('A1:D3').FindPrevious(After:=rng) '如果找到单元格并且不是最先找到的单元格,则继续循环操作 Loop While Not rng Is Nothing Andrng.Address <> firstRng End If End Sub
你可以使用F8键逐行调试代码,观察VBA是按什么顺序给这三个单元格添加背景色的,以此来加深对FindNext方法和FindPrevious方法的理解。
--------------------------------------
如果您对本文介绍的内容有什么建议或好的示例,欢迎发送邮件给我:xhdsxfjy@163.com
通过下列方式可以更快地了解完美Excel更新:
关注《完美Excel》微信公众账号: |
|