第一章 入门篇
1.18 Find语句
Find语句的功能相当于Excel菜单里的“查找”。该语句的语法是这样的:
Range("要查找的区域").Find(What,After,Lookin,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat)
Find语句在要查找的区域中查找信息,返回找到该信息的第一个单元格,没找到返回Nothing。
让我们来了解一下Find的参数:
Find语句有这么多参数,其实它只有一个必选参数What,其它参数都是可选。
What 要查什么?
After 在哪个单元格之后开始查询
Lookin:
xlformulas 查询公式
xlvalues 查询值
xlcomments 查询批注
LookAt:
xlWhole 精确查询,简写1
xlPart 模糊查询,简写2
SearchOrder:
xlByRows 按行查找,简写1
xlByColumns 按列查找,简写2
SearchDirection:
xlnext 向下查找(默认),简写1
xlprevious 向上查找,简写2
MatchCase 默认值为False不区分大小写,如果为True则搜索区分大小写。
大家可以对照一下,Find语句的参数设置,与Excel菜单里的“查找”具有的功能是一一对应的。在“查找”菜单里点选的功能,都可以通过设置Find语句的参数,在VBA里实现。
查找内容可以使用通配符,如:*、?等。
例句:
在下表中的B列找到台式电脑,弹出它的地址。
卡片号 | 资产名称 | 建卡日期 | 原值 | 净值 |
00007933 | 空调 | 2007-12-31 | 498720.00 | 14961.60 |
00007934 | 台式电脑 | 2007-12-31 | 35670.00 | 1070.10 |
00012189 | 音响设备 | 2007-12-31 | 12420.00 | 372.60 |
00014439 | 照相机 | 2008-06-11 | 6800.00 | 204.00 |
00014439 | 音响设备 | 2008-06-11 | 6800.00 | 204.00 |
00014439 | 音响设备 | 2008-06-11 | 6800.00 | 204.00 |
00072375 | 监控设备 | 2013-12-28 | 16986.00 | 509.58 |
00072448 | 空调 | 2013-12-28 | 6405.00 | 192.15 |
MsgBox Range("b:b").find("台式电脑").Address
这样返回的是一个绝对引用地址:$B$3,这时可以用.Address(0,0),返回B3。
小程序:
从上表中随机抽取3个卡片号,把抽取结果输入到“g”列。
Sub find()
h = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 3
sj = Application.RandBetween(2, h)
Set 查找结果 = Range("g:g").find(Cells(sj, 1))
If 查找结果 Is Nothing Then
Cells(i, "g") = Cells(sj, 1)
End If
Next
End Sub
我们看一下这条语句:
sj = Application.RandBetween(2, h)
在这条语句里,我们引用了Excel的一个函数RandBetween来生成一个随机数。想在VBA里引用现有的Excel函数时,在函数前加上Application就可以了,用法与函数的使用相同。
我们先用RandBetween函数生成一个在2和最大行数之间的随机数,然后把该随机数对应的卡片号在"g"列查找。因为查找到的结果是一个单元格对象,所以查找结果的赋值要加上"Set"。如果找到了,说明该卡片号已经被抽取到"g"列了,所以不再重复抽取。如果没找到,就把该卡片号复制到"g"列。
不过这个程序运行以后,可能因为产生的随机数会相同,所以抽取的卡片达不到3个。所以我们可以把For循环的次数加大,结果Exit For语句使用。上面的程序我们可以修改一下:
Sub find()
h = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 10
sj = Application.RandBetween(2, h)
Set 查找结果 = Range("g:g").find(Cells(sj, 1))
If 查找结果 Is Nothing Then
n = n + 1
Cells(n, "g") = Cells(sj, 1)
End If
If n = 3 Then Exit For
Next
End Sub
这样就能保证每次都能抽取到3个卡片号了。不过这样写程序,如果For循环的次数设置的不合理,仍然不会得到我们想要的结果。在以后的章节里,我们会学到另一个循环语句Do Loop语句,它会无限次循环,直到达到我们需要的结果为止。本章节主要是介绍Find语句的用法,各位可以自己动手编写一些语句,测试一下Find语句每个参数的用法。
往期精彩回顾:
学习VBA,报表做到飞 第一章 入门篇 1.17 AutoFilter语句
学习VBA,报表做到飞 第一章 入门篇 1.16 Sort语句
学习VBA,报表做到飞 第一章 入门篇 1.15 EXIT语句
我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!