每天一篇Excel技术图文微信公众号:Excel星球NO.145-I Find You作者:看见星光微博:EXCELers / 知识星球:Excel

HI,大家好,我是星光。这章继续给大家分享VBA常用对象之单元格的编程技巧。虽然没有自古以来,但依然众所周知的是,在Excel中有一个很常用的功能:查找与替换。而在VBA编程中也有与之对应的两个方法:Find和Replace。

我们先来聊Find,相比于Replace它更常用。

1 丨

基本语法

Find是单元格对象的方法,默认在指定的区域中查找包含某个数据的单元格。若找到符合条件的数据,则返回包含该数据的单元格;若未找到符合条件的,则返回Nothing。

语法格式如下▼

.Find (What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])

语法看的一脸懵逼?都是洋文惹的锅!其实,以上参数基本对应了查找对话框中的各个选项。

我来给您翻译一下:

.Find (查找值,[查找开始位置],[查找范围的类型],[匹配方式完全匹配还是部分匹配],[查找方式行或列],[查找方向前或后],[是否区分大小写],[全角或半角],[查找单元格的格式])

还是一脸懵?打个响指,语法中带中括号的部分都是可选的,所以我再给你简化一下,只保留最常用的两个参数。

.Find (查找值,[匹配方式是完全匹配还是部分匹配])

这样是不是就很简单了?

送佛送到西,不论男女,都抱你上花轿,我再给你举个例子。

以上图所示的数据表为例,查找是否存在字段名"语文"。如果存在,则弹窗显示行号和列标;如果不存在,则显示查无此货。

示例代码如下:

代码看不全可以左右拖动..▼

Sub rngFind()    Dim rng As Range '定义一个单元格对象    Set rng = Cells.Find(what:="语文", lookat:=xlWhole)    If rng Is Nothing Then        MsgBox "查无此货"    Else        MsgBox "行:" & rng.Row & " 列:" & rng.Column    End IfEnd Sub

代码解析▼

第2行代码定义一个变量rng,类型为单元格对象。

第3行代码使用Find方法在当前工作表整个区域中查找字符串"语文",匹配方式为整体匹配(xlWhole),并将查询结果赋值给变量rng。

第4行至第8行代码判断rng是否为Nothing。如果条件成立,则说明查无结果;如果条件不成立,则返回查找结果的行号和列标。

本例返回结果如下:

2 丨

模糊匹配查询

Find方法和Excel「查找替换」一样,也支持模糊匹配。实现的方式有两种,将匹配方式lookat设置为xlPart,或者在查找值使用通配符。
依然以上节所示的数据表为例,如需查找人名中包含"星光"的语文成绩,可以使用以下代码。代码1,xlPart方法..▼

Sub rngFindPart()    Dim rng As Range '定义一个单元格对象    Set rng = Cells.Find(what:="星光", lookat:=xlPart) '部分匹配    If rng Is Nothing Then '如果查无结果...        MsgBox "查无此货"    Else '如果查有结果,则向右偏移1位取值        MsgBox rng.Value & "语文成绩是:" & _            rng.Offset(0, 1).Value    End IfEnd Sub

第3行代码设置匹配方式为部分匹配,如果查有结果,第7行代码使用Offset语句,将结果单元格向右偏移一个单元格获取语文成绩。

代码运行后,返回结果如下:

代码2,通配符方法..▼

Sub rngFindWildcard()    Dim rng As Range '定义一个单元格对象    Set rng = Cells.Find(what:="*星光*", lookat:=xlWhole) '查找值使用了通配符*    If rng Is Nothing Then        MsgBox "查无此货"    Else        MsgBox rng.Value & "语文成绩是:" & _            rng.Offset(0, 1).Value    End IfEnd Sub

第3行代码将Find语句的查找值设置为*星光*,星号作为通配符,可以代表任意个字符,因此该查找值的意思就是包含星光的字符串。

……

相比于xlPart方法,通配符要更灵活一些,它不但能表达包含关系,也能表达以某个字符开始或结束的查找值,比如看见*,表达了以看见两个字为开头的数据。*星光,则表达了以星光两个字结束的数据。

除此之外,还有一个通配符问号?,一个问号只代表一个字符。比如,如果我们需要查找由4个字符构成的数据,查找值可以设置为????

……

3 丨

查找工作表

最后数据所在的行号

在本系列教程第20课「什么是单元格对象」,咱们分享了多种表达数据列表最后一行的方法,如下▼

Sub LastRow()    Debug.Print ActiveSheet.UsedRange.Rows.Count    Debug.Print Range("a1").CurrentRegion.Rows.Count    Debug.Print Cells(Rows.Count, "a").End(xlUp).RowEnd Sub

当时也有给大家讲了这3种方法各自的优缺点;一个糟糕的情况是:在没有特殊设置的前提下,它们都不能准确的表达数据列表最后一行的位置。

以上图所示的数据为例,数据的最后一行行号应为10;但以上代码返回的结果分别为13(UsedRange)、8(CurrentRegion)、8(End)。至于原因,那一章咱们讲过了,这里就不再重复。

使用Find方法可以解决这个问题。代码如下▼

Sub FindLastRow()    Dim rng As Range    Set rng = Cells.Find("*", _            LookIn:=xlFormulas, SearchOrder:=xlByRows, _            SearchDirection:=xlPrevious)    If rng Is Nothing Then        MsgBox "空表,无数据"    Else        MsgBox "最后一行是:" & rng.EntireRow.Row    End IfEnd Sub

第3行代码设置查找值为通配符为*,代表任意字符;查找范围的类型为公式,查找方式为行,查找方向是向前。运行以上代码返回结果如下。

上述Find语句的参数设置的有点繁多?摊手,确实如此,不过大部分情况下,除了查找值以外,其它参数都是默认值,是可以省略的。

只所以说大部分情况下是因为……Find语句实际上调用的是「查找替换」功能的相关选项设置作为默认参数的。换句话说,如果用户使用过「查找替换」功能,并修改了选项设置,比如将查找查找范围的类型修改为"批注";那么Find方法也就默认使用「查找替换」的属性,只会在"批注"中查找是否有符合结果的数据。

所以,万全之策,还是建议在使用Find语句时将相关参数设置完整……这可以通过录制宏来获取,并不需要强行记忆。「查找替换」功能的选项设置会影响Find方法,反过来,Find方法也会影响「查找替换」功能的选项设置。比如,我们使用Find语句设置了查找值、匹配方式等,当你再次打开Excel的「查找替换」功能,就会发现相关选项也被修改了。
你可以像我一样帅不自知,但不能像我一样掉坑而不自知;所以,以上,多少还是需要留意一下滴。看个广告休息一下
没有广告的微信文是不真诚的▼

4 丨

查找符合条件的全部结果

咱们上面讲的都是查找一个结果的情况,如果需要查找的结果有多个,也就是通常说的一对多查询,又该怎么处理呢?Find方法并不拥有「查找与替换」功能里【查找全部】的能力——可以使用FindNext语句。
我举个例子。

如上图所示,是一张长相喜人的成绩表,名称为"综合成绩表",现在需要查询"看见星光"所有的考试成绩明细,查询结果如下。

示例代码如下:

代码看不全可以左右拖动..▼

Sub DoFindNext()    Dim sht As Worksheet, rng As Range    Dim k As Long, strADS As String, s As String    Application.ScreenUpdating = False '取消屏幕刷新    ActiveSheet.UsedRange.Offset(1).ClearContents '保留结果表标题行,清空其它值    s = "看见星光" '查找值    k = 1 '记录行位置初始为1    Set sht = Worksheets("综合成绩表") '数据表    Set rng = sht.Cells.Find(what:=s, lookat:=xlWhole) '完全匹配查询    If Not rng Is Nothing Then        strADS = rng.Address '如果查有结果,则将单元格地址复制变量strADS        Do            k = k + 1 '计数器            Cells(k, 1) = rng '姓名            Cells(k, 2) = rng.Offset(0, 1) '语文            Cells(k, 3) = rng.Offset(0, 2) '英语            Set rng = sht.Cells.FindNext(rng) '查找下一个            If rng.Address = strADS Then Exit Do '循环一轮后退出Do循环体        Loop    End If    Application.ScreenUpdating = True    MsgBox "查询OK"End Sub

代码解析:

第4行代码清空当前工作表除了标题行以外的所有数据。

第9行代码使用单元格对象的Find方法,采用完全匹配的方式,在工作表"综合成绩表"中查询"看见星光"。如果查有结果,则在第11行代码返回结果单元格的地址,并赋值给字符串变量strADS.

第13至第16行代码累计结果行数,并根据查询结果单元格的位置,向右偏移,获取语文和数学成绩等信息,写入结果工作表。

第17行代码使用FindNext语句查询下一个目标。

FindNext语句的意思是查找下一个目标,语法格式如下。

.FindNext(After)

它只有一个参数,一个指定的单元格,系统将从该单元格之后开始进行查找。既然是之后,那么开始查找时,查找的范围就不包含该单元格,只有当循环查了一圈,只剩下该单元格了,才会查找它的内容是否符合条件。

根据这个规则,我们将首个查询结果的地址赋值给变量strADS,然后只要判断FindNext的返回结果是否等于strADS,即可判断系统是否对所有的单元格都查询过了。如果这个条件成立,则退出Do循环。

需要注意的是,由于FindNext始终是在指定单元格之后的范围进行查找,所以必须使用上一次所找到结果的单元格作为参数,如果使用一个固定的单元格地址,也就会始终返回一个固定的结果——此时,叮咚,恭喜你,很可能这是你VBA编程生涯第一次陷入死循环。

……

是不是觉得FindNext很绕?不大好理解?叮咚,再次恭喜你,其实这语句实际上很少用,惊不惊喜意不意外?——同样的问题,我们更多的时候是使用数组循环。

数组循环解法如下。

Sub DoArray()    Dim s As String, k As Long    Dim arr, i As Long, j As Long    Application.ScreenUpdating = False '取消屏幕刷新    ActiveSheet.UsedRange.Offset(1).ClearContents '保留结果表标题行,清空其它值    s = "看见星光" '查找值    k = 1 '记录行位置初始为1    arr = Worksheets("综合成绩表").UsedRange    For i = 1 To UBound(arr)'遍历行        For j = 1 To UBound(arr, 2) '遍历列,也就是遍历数组中每一个元素            If arr(i, j) = s Then                k = k + 1 '计数器                Cells(k, 1) = s '姓名                Cells(k, 2) = arr(i, j + 1) '语文成绩                Cells(k, 3) = arr(i, j + 2) '数学成绩            End If        Next    Next    Application.ScreenUpdating = True    MsgBox "查询OK"End Sub

第9行至第18行代码遍历数组中的每一个元素,如果元素等于查找值,则按列偏移获取语文和数学的成绩——这思路是不是比FindNext语句简单多了?简直是数组无脑循环的典范!

有位叫李宗盛的大哥说过,有一天,你会知道,在VBA编程里无脑循环并不是贬义词~……

……

5 丨

Replace语句

最后再给大家讲一下如何用VBA代码实现「替换」功能,也就是单元格Replace方法。语法格式如下▼

.Replace(What、Replacement、LookAt、SearchOrder、MatchCase、MatchByte、SearchFormat、ReplaceFormat)

翻译一下▼

.Replace(查找值、替换值、匹配方式是完全匹配还是部分匹配、[查找方式行或列]、是否区分大小写、全角或半角、按格式搜索、按格式替换)

最常用的只有前面3个参数,简化后如下。

.Replace(查找值,替换值,匹配方式:完全匹配还是部分匹配)

举个例子,将当前工作表中所有的"看见星光"替换为"看见月光"。

代码如下▼

Sub rngReplace()    Cells.Replace "看见星光", "看见月光", xlWholeEnd Sub

是不是很简单?

需要注意的是,和Find方法一样,「查找替换」的选项设置也会影响Replace方法,反过来,Replace方法也会影响「查找替换」相关选项设置。比如,以上述代码为例,如果省略了第3参数,则通常默认执行的是部分匹配,毕竟部分匹配是「查找替换」的默认选项。

……

就酱,打完手工,下期再见。

更多零基础学VBA编程教程▼菜单->教程->零基础学VBA练手下载百度网盘..▼https://pan.baidu.com/s/1PrZN9mMDqAdyEfkV7vXqwQ
提取码: rznr▎全方位系统学习Excel
推荐加入我的
付费Excel社群 ▎点击图片可获取相关推文..▼

excel查找功能_如何使用VBA代码实现Excel的查找和替换功能?相关推荐

  1. 用javascript实现以下功能!_用python80行代码实现一个微信消息撤回捕捉功能

    自从微信出了这个消息撤回功能小编我都已经快被折磨死了,小编本来就是个好奇心比较重的人,微信出了这个功能之后小编感觉身体一天不如一天了,每次看着女神发来的信息又撤回,可谓是心里痒痒啊.所以小编就写了一个 ...

  2. c语言大乐透编译,Excel大乐透摇号vba代码分享,说不定就中百万了呢

    大家好我是Excel从零到一,今天闲来无聊做了一套大乐透摇号程序的vba代码分享给大家 来看下效果 Excel大乐透摇号vba代码分享,说不定就中百万了呢 Sub 摇号() Dim i, a, tes ...

  3. vba excel 开发游戏_为什么要学习VBA?

    VBA是一种编程语言,它依托于Office软件,可以实现各种Office软件操作的自动化.也就是说,只要我们用Office软件,如EXCEL,WORD也就是有了应用VBA的理由.为什么用VBA呢?其实 ...

  4. 【VBA】 将VBA代码插入Excel中

    将VBA代码插入到非宏Excel的Sheet表代码中,常用于达到单元格SelectionChange的效果,其他意义不大. 使用目的: (1)用户能够对SelectionChange事件的有效无效进行 ...

  5. vba excel 开发游戏_自动化神器—VBA

    VBA(Visual Basic For Application)是一种通用的自动化语言,它可以使Excel中常用的操作步骤自动化,还可以创建自定义的解决方案. VBA好比Excel的"遥控 ...

  6. 升级:DNAtools for Excel工具箱,2.x英文版- VBA代码破解工具

    原始出处:www.cnblogs.com/Charltsing/p/DnaTools.html QQ:564955427 DNA工具箱全部功能一览:    单元格焦点指示(支持Excel 2007~2 ...

  7. Excel中删除重复数据(用VBA代码)

    请仔细阅读并修改相关数据.我推荐使用第二种方法,是我修改的,很好用,第三种情况用得比较少.  第一种情况保留不重复的记录行,重复的只保留一行. 1.打开有重复数据的EXCEL 2.Alt+F11 打开 ...

  8. [No0000C1]Excel 删除空白行和空白列VBA代码

    在exce中删除空行和空列的方法有很多,相对而言删除空行较为简单,只需进行筛选,将空白行筛选出来,删除即可,但要删除空列比较困难.因为你不能按列进行筛选删除.Excel中没有这个功能.当然你可以用另外 ...

  9. 查询时拼接两列数据_如何用VBA代码查询两列数据差异?

    爱就一个字,我只说一次-- 北京市第三交通委提醒您:代码千万条,注释第一条,命名不规范,修订两行泪-- 咳,给大家拜晚年了,再提前祝大家元宵快乐-- 我们今天和大家分享的内容是如何用VBA代码查询两列 ...

最新文章

  1. 面试:BigDecimal一定不会丢失精度吗?
  2. 第九周项目一-深体验复制(2)
  3. 如何在php中插入map热点,PHP中使用BigMap实例
  4. [react] 如何给非控组件设置默认的值?
  5. hbase数据读取优化_read读取优化_HBase最佳实践_HBase开发指南_云数据库 HBase - 阿里云...
  6. Android使用HttpURLConnection下载图片
  7. Liunx/Unix scp命令详解(转)
  8. 管理感悟:派谁进行技术合作
  9. 举例理解哈夫曼树与哈夫曼编码
  10. Janusgraph索引
  11. ABAP ALV上的红绿灯状态
  12. PX Deq Credit: send blkd (3)---Script to monitor parallel queries (文档 ID 45
  13. mysql报1032_MySQL SQL_ERROR 错误号 1032解决办法
  14. iOS开发之响应式编程RAC
  15. 活动运营中如何准确把握用户心理
  16. word文件损坏怎么恢复?
  17. ios runtime重要性_iOS 之runtime运行机制理解
  18. linux学习笔记(五)编译内核模块生成ko驱动文件
  19. STM32简易示波器开发总结
  20. 打开计算机文件夹找不到桌面文件,软件已启动电脑找不到文件怎么办

热门文章

  1. Discuz数据库调用:DZ模板调用常用代码手册
  2. 滴滴实时计算平台在运营监控方面的应用
  3. paper reading——《Improving Person Re-identification by Attribute and Identity Learning》
  4. Invariance Matters: Exemplar Memory for Domain AdaptivePerson Re-identification
  5. Android学习笔记——归纳整理
  6. vue中使用echarts中国地图
  7. 【附源码】计算机毕业设计JAVA羽毛球馆场地管理系统
  8. 湖南省智慧教育装备展示体验中心关于暂停研学、暑假社会实践等活动通知
  9. 李航老师《统计学习方法》第二版第三章课后题答案
  10. 电商项目_dwd主题域