前两天有位朋友问了一个这个问题 这个问题用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函数再好不过。可以先查询关键字“零件编号”位置,其他都好办了。 代码如下
offset(0,1)代表,找到的目标单元格向右移动一次的单元格。 ●实例2:获取每行最后一个黄色单元格地址。 思路:因为是查找颜色,所以参数SearchFormat:=True。(前面截图有讲,忘记的翻看一下)。
Rng.Cells(1, 1) 表示区域左上角第一个单元格。 为什么这段代表可以找到最后一个黄色单元格?关键就在After和SearchDirection两个参数的搭配上,从区域(本例是某一行所有的单元格)的第一个单元格cells(1,1)往前查,再往前不就是到最后一个了吗? ●实例3:回到文章开头的问题:返回每行第2个非空单元格的值 思路:要找到每行第2个非空单元格,重点在于先找到第一个。上个例子,找到最后一个黄色单元格可以实现,这次我们倒过来。
What:="*" 表示查找的是非空单元格。第一个Find是找出来每行第一个非空单元格,接着以这个单元格为起点,接着得到第2个非空单元格。 感谢关注我的1260位朋友。 也欢迎大家留言,留言我都会回复的,尽全力帮助解决。
|
|