四时宝库

程序员的知识宝库

学习VBA,报表做到飞 第一章 入门篇 1.18 Find语句

第一章 入门篇

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语句

我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接