Excel VBA 8.44打造更加高效的查找功能 秒杀自带功能
打造更加高效的查找功能 秒杀自带功能
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
经过了之前一段时间的学习,我们大致了解了单元格内容的提取,拆分等操作,同时也是延伸到了单元格公式等内容的扩展
相信大家对于这部分的知识,应该有了一定的了解了。
今天我们继续按照计划往下走,来学习下单元格内容的查找
说到内容的查找,小伙伴们肯定会丢个白眼给我,并在内心丢给我一张图
相信在大家的日常工作中,查找功能一定是非常常用的,在Excel表格中找一个数据,上手就是CTRL+F,通过查找功能来查找,某种程度上来说是非常的方便的,一个数据的查找,并且选中,很简单,但是如果碰到多个数据的查找的时候,就非常的麻烦,比方说某个产品的编号,一个数据表中肯定有很多个相同的产品编号,那么我们需要查找N次,这就非常的麻烦了,或者像下面这样查找全部
这样虽然展示出来了所有的结果,但是我们无法直接去定位,非常的不方便,也不能够直接筛选取数,那么我们是否可以换个角度出发,查找到指定的内容之后,给他一个颜色,然后我们可以根据某个颜色来进行筛选,这样是不是更加的方便呢?
相同的颜色代表了相同的数据,这样看起来效果也是更加的好
这是我在日常工作中经常会有的想法,有想法就要有行动,所以今天我就直接用VBA来实现这样的想法。
场景说明
这是我们今天的数据源,我们要实现的目标是,将查询的结果,直接在原数据中表现出来,高亮出来,这样我们看起来也是更加的方便。
代码区
Sub test()
Dim rng As Range, trng As Range, frng$, a As Range
s = Application.InputBox("查找内容的确定", "请输入查找内容", , , , , , 3)
With ActiveSheet.UsedRange
Set rng = .Find(s)
If Not rng Is Nothing Then
frng = rng.Address
Set trng = rng
Else
MsgBox "无匹配数据"
Exit Sub
End If
Do
Set rng = .Find(s, after:=rng)
rng.Select
If frng <> rng.Address Then
Set trng = Union(trng, rng)
Else
Exit Do
End If
Loop
End With
trng.Interior.Color = vbRed
End Sub
代码并不算是很长,直接来看看效果
这里的动图呢,我们展示两个不同的效果,首先我们先看看Excel自带的查找功能,还无意外的,虽然能够找到数据,但是定位非常的麻烦,也不够醒目,而我们通过VBA代码实现的“进阶”查找功能,则可以在定位的同时,标准颜色,这样更加方便我们查找数据
一比较就知道那种效果更加的好了
代码解析
在Excel中我们都是按下CTRL+F实现查找功能的,那么在VBA中呢?
Set rng = .Find(s)
也是这样简单的一句话,find的就是查找的意思,非常好理解。
然后进入今天的代码核心逻辑。
单元格查找的逻辑才是代码的核心。
Set rng = .Find(s)
If Not rng Is Nothing Then
frng = rng.Address
Set trng = rng
Else
MsgBox "无匹配数据"
Exit Sub
End If
我们先来看看这段代码的作用
我们在查找数据的时候,首先需要判断数据中是否存在我们要查找的数据,如果存在才需要执行后面的查找,如果不存在,则可以直接弹窗提示不存在匹配的数据了。
所以代码一开始就是在数据源找第一个匹配的数据,我们定义为frng
frng= first rng,即第一个单元格
在整个rng这个中查找满足条件的第一个单元格
如果第一个单元格存在,才需要后面的操作,继续寻找第二个
反之,则可以直接弹窗提示“不存在~~”
如果存在第一个单元格,我们先将这个单元格重新定义为trng
然后得到trng的单元格位置,如何得到单元格的位置呢?
frng = rng.Address
有了第一个单元格之后,我们就可以查找第二个单元格了
如何查找第二个单元呢?
Set rng = .Find(s, after:=rng)'第二个单元格
Set rng = .Find(s)'第一个单元格
我们将这两个代码放在一起比较一下
方法都是一样的,都是通过rng.find方法,唯一不同的就是在查找第二个单元格的时候,多了后面一部分
after:=rng
这是什么意思呢?
after明显就是后面的意思,rng就是我们上面已经得到的第一个单元格,合起来就是从第一个单元格往后找,看下图
此B3这个单元格往后找,才会来到C6这个单元格,如果 after:=rng这句话,那么会是什么结果呢?
从上面的结果来看,最终返回的结果只有第一个单元格高亮了。
综上说明,如果没有after:=rng的话,代码是不会继续往下查找的,只会找到第一个单元格就跳出循环了,这点,大家在使用的时候要注意
这是要注意的第一个点
上面我们不是留下一个小悬念,为什么我们要获得第一个单元格的位置呢?
现在就用到了。
If frng <> rng.Address Then
这里为什么还要判断一下位置呢?
虽然我们要找的是第二个单元格,但是不排除单元格区域内有且仅有一个满足条件的,如果这个时候不作出判断的话,就会一直无限死循环了。
这是要注意的第二个点
来看看实际的案例(这里上不了图,总是上传失败。。。。)
可以看到,这两个rng的位置是完全不同的,这样就可以判断,还存在第二个单元格,以此类推
最后利用单元格的union方法,将所有的单元格都汇总起来
一次性填充颜色高亮,就可以了
Set trng = Union(trng, rng)