Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 12253|回复: 6

[分享] 自己编写的Find方法增强函数,可返回多个查找值

[复制链接]
发表于 2011-5-17 00:36 | 显示全部楼层 |阅读模式
本帖最后由 wbzxz 于 2011-5-17 08:44 编辑

在初学VBA的时候,就感觉Range对象find方法很好用,尤其是找到某个值的时候,也不用循环(嘿嘿,因为我比较懒),但是find方法有个缺陷,一次只能找一个,比较郁闷,要多找几个的话,需要FindNext和FindPreviouse配合才行,所以每次碰到这个问题,总要写个循环,那时候就想着怎么样一次能找到全部符合条件的单元格呢,最近又碰到同样的问题,就通过翻阅资料,自己学着写了一个(其实网络上有人写的现成的),我也是自己学习,同时也愿意和大家分享。
我的这个函数的特点是,返回了一个collection对象,单元格都存在这个对象里面,可以通过索引值来引用,也容易循环,同时也可以删除添加,进行下一步处理。

我也只是初学,函数写的不对的地方,请大家指出来,我学习和修改,大家也可以试着用一用,嘿嘿。

  1. '本函数是一个find方法的增强函数,结合FindNext和FindPrevious方法,可以返回一组符合条件的单元格的集合;
  2. '本函数返回一个Collection对象,里面储存了找到的单元格;
  3. '本函数有两个必选参数:
  4. '   1.SearchRange 用来存放需要查找的区域;
  5. '   2.FindWhat用来存放需要查找的值;
  6. '其余参数都是可选参数,与Find方法参数相同;
  7. '无论是否查找到单元格,都会返回一个collection对象;
  8. '我们用Collection.Count=0,来判断,没有找到匹配的单元格;

  9. Function FindPlus(SearchRange As Range, FindWhat As Variant, _
  10.                   Optional After As Range, _
  11.                   Optional LookIn As Variant = xlFormulas, _
  12.                   Optional LookAt As Variant = xlPart, _
  13.                   Optional SearchOrder As Variant = xlByRows, _
  14.                   Optional SearchDirection As Variant = xlNext, _
  15.                   Optional MatchCase As Variant = False, _
  16.                   Optional MatchByte As Variant = True, _
  17.                   Optional SearchFormat As Variant = False) As Collection

  18. Dim FoundCell As Range '存放找到的单元格区域;
  19. Dim AfterCell As Range '存放查找的起始单元格;
  20. Dim FoundCol As Collection '存放找到单元格区域的集合;
  21. Dim FirstAddress As String '存放第一次找到的单元格的地址

  22. Set FoundCol = New Collection 'Collecion类实例化为对象

  23. '下面这个判断语句完成对After参数值的控制
  24. If After Is Nothing Then
  25.   Set AfterCell = SearchRange(SearchRange.Count) '如果after参数为空,则默认值为查找区域的最后一个单元格
  26. Else
  27.   Set AfterCell = After '如果after参数不为空,这用提供的after参数值
  28. End If

  29. '查找第一个符合条件的值
  30. Set FoundCell = SearchRange.Find(what:=FindWhat, After:=AfterCell, _
  31.                               LookIn:=LookIn, _
  32.                               LookAt:=LookAt, _
  33.                               SearchOrder:=SearchOrder, _
  34.                               SearchDirection:=SearchDirection, _
  35.                               MatchCase:=MatchCase, _
  36.                               MatchByte:=MatchByte, _
  37.                               SearchFormat:=SearchFormat)


  38. If Not FoundCell Is Nothing Then
  39.     FirstAddress = FoundCell.Address '如果找到第一个值,然后把单元格地址赋值给FirstAddress变量
  40.    
  41.     '下面的循环是在区域里不断查找需要的值,并不断添加到FoundCol集合
  42.     Do
  43.       FoundCol.Add FoundCell '把找到的单元格赋值给FoundCol对象
  44.       
  45.       '根据SearchDirection参数,判断是向上搜索,还是向下搜索
  46.       If SearchDirection = xlNext Then
  47.         Set FoundCell = SearchRange.FindNext(After:=FoundCell)
  48.       Else
  49.         Set FoundCell = SearchRange.FindPrevious(After:=FoundCell)
  50.       End If
  51.     Loop Until (FoundCell Is Nothing) Or (FoundCell.Address = FirstAddress) '经典用法,只要找到单元格和第一个找到的单元格地址不一样,就一直循环
  52. End If
  53. Set FindPlus = FoundCol '把集合对象赋值给函数名
  54. End Function
复制代码

附件如下,大家请下载试用
FindPlus函数.rar (14.54 KB, 下载次数: 310)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-11 00:08 | 显示全部楼层
回复

使用道具 举报

发表于 2017-6-13 15:19 | 显示全部楼层
本帖最后由 1071614166 于 2017-6-13 15:22 编辑

求救!!怎么下载了附件  运行显示  下标越界???
回复

使用道具 举报

发表于 2020-6-15 08:30 | 显示全部楼层
这功能厉害。是否可以查找多个不同数值呢?
回复

使用道具 举报

发表于 2020-6-15 16:20 | 显示全部楼层
好厲害,收下學習,感謝分享.
回复

使用道具 举报

发表于 2021-11-11 22:37 | 显示全部楼层
好东东
回复

使用道具 举报

发表于 2021-11-11 23:01 | 显示全部楼层
Function FindPlus 可以當工作表函數使用嗎?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-26 14:35 , Processed in 0.332250 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表