前两天有位朋友问了一个这个问题
这个问题用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.UsedRangess = Rng.Find("零件编号", , xlValues, xlWhole, xlByColumns, xlNext, True, True).Offset(0, 1).ValueEnd 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 NextEnd Sub
Rng.Cells(1, 1) 表示区域左上角第一个单元格。
为什么这段代表可以找到最后一个黄色单元格?关键就在After和SearchDirection两个参数的搭配上,从区域(本例是某一行所有的单元格)的第一个单元格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 NextEnd Sub
What:="*" 表示查找的是非空单元格。第一个Find是找出来每行第一个非空单元格,接着以这个单元格为起点,接着得到第2个非空单元格。
感谢关注我的1260位朋友。
也欢迎大家留言,留言我都会回复的,尽全力帮助解决。
联系客服