分享

不得不说的高效Boy:Find方法

 VBA说 2020-04-07


前两天有位朋友问了一个这个问题

这个问题用Find方法解决最好不过。因为如果用对单元格循环判断是否不为空的思路,会很耗内存。

我们就来说说Range.Find方法。

由Excel查找功能引入

我们先来看看Excel中常用的的查找功能,Ctrl+F出现查找对话框。可以查找数据、格式等。Excel的这个功能对查找指定的数据非常有用,特别是在含有大量数据的工作表中搜索数据时,更能体现出该功能的快速和便捷。

同样,在Excel VBA中有与该功能对应的Find方法,提供了一种在单元格区域查找特定数据的简单方式,并且比用循环方法进行查找的速度更快。

Find方法作用

Find方法将在指定的单元格区域中查找包含参数指定数据的单元格,若找到符合条件的数据,则返回包含该数据的单元格;若未发现相匹配的数据,则返回Nothing该方法返回一个Range对象

从上面的描述我们知道,Find是在指定的单元格区域中查找的,所以一定要在Find前面加上单元格区域。Find方法是属于Range对象的。

感觉好多无聊废话,不过很重要,认真听,使用的时候你会回来看一遍的。

Find方法语法

<单元格区域>.Find (What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])


看见语法就头疼,翻译成汉语:

<单元格区域>.Find (要查找的数据开始查找的位置,查找的范围类型,完全匹配还是部分匹配,行列方式查找,向前向后查找,区分大小写,全角或半角,查找格式)

PS:上述语法加粗部分是常用的,能解决大部分问题。

上图中没有列出来的:

参数SearchDirection,可选。用来确定查找的方向,即是向前查找(XlPrevious)还是向后查找(xlNext),默认的是向后查找

参数After,可选。指定开始查找的位置,即从该位置所在的单元格之后向后或之前向前开始查找(也就是说,开始时不查找该位置所在的单元格,直到Find方法绕回到该单元格时,才对其内容进行查找)。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。


注意:

在每次使用Find方法后,参数LookIn、LookAt、SearchOrder、MatchByte的设置将保存。如果下次使用本方法时,不改变或指定这些参数的值,那么该方法将使用保存的值。

若用户在“查找与替换”对话框中更改了这些参数,它们将同时反映到程序代码中,当再次运行代码时,运行结果可能会产生差异或错误。若要避免这个问题,在每次使用时建议明确的设置这些参数!


一口气写这么多,歇会儿

Find方法使用实例

●实例1:查找"零件编号"

思路:如果要提取表格中“零件编号”后面的实际编号MS-001,并且每个表格中零件编号的位置不确定,这个时候用Find函数再好不过。可以先查询关键字“零件编号”位置,其他都好办了。

代码如下

Sub Find方法例子1() Set Rng = ActiveSheet.UsedRange ss = Rng.Find("零件编号", , xlValues, xlWhole, xlByColumns, xlNext, True, True).Offset(0, 1).Value End Sub

offset(0,1)代表,找到的目标单元格向右移动一次的单元格。

●实例2:获取每行最后一个黄色单元格地址。

思路:因为是查找颜色,所以参数SearchFormat:=True。(前面截图有讲,忘记的翻看一下)。

Sub 查找最后一个黄色单元格()    Application.FindFormat.Interior.Color = 65535 '黄色单元格的编号    For i = 1 To 10  '举例查找前10行        Set Rng = Rows(i).Cells        Set cl = Rng.Find(What:="", After:=Rng.Cells(1, 1), LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=True)        MsgBox cl.Address    Next End Sub

Rng.Cells(1, 1) 表示区域左上角第一个单元格。

为什么这段代表可以找到最后一个黄色单元格?关键就在AfterSearchDirection两个参数的搭配上,从区域(本例是某一行所有的单元格)的第一个单元格cells(1,1)往前查,再往前不就是到最后一个了吗?

●实例3:回到文章开头的问题:返回每行第2个非空单元格的值

思路:要找到每行第2个非空单元格,重点在于先找到第一个。上个例子,找到最后一个黄色单元格可以实现,这次我们倒过来。

Sub 查找每行第二个非空单元格1()    For i = 1 To 5        Set Rng = Rows(i).Cells        Set cl = Rng.Find(What:="*", After:=Rng.Cells(1, Columns.Count), LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext)        Set cl1 = Rng.Find(What:="*", After:=cl, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext)        MsgBox cl1    Next End Sub

What:="*" 表示查找的是非空单元格。第一个Find是找出来每行第一个非空单元格,接着以这个单元格为起点,接着得到第2个非空单元格。

感谢关注我的1260位朋友。

也欢迎大家留言,留言我都会回复的,尽全力帮助解决。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多