ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > Find方法的增强,可查找多个返回值的Find函数

Find方法的增强,可查找多个返回值的Find函数

作者:绿色风 分类: 时间:2022-08-18 浏览:83
楼主
wbzxz
初学VBA,写了一个简单的findplus函数,当查找某个值时,可以同时查找出多个单元格,而不像find方法一样,只返回一个值;函数编写过程中,参考了“完美Excel博客的FindAll函数”,非常感谢前辈的无私的奉献。

  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




附件中有源代码与示例用法,代码在Sheet2模块中:

FindPlus函数.rar
2楼
biaotiger1
find方法仅返回一个值,还要配合findnext才能返回多个值。
返回多个值的类find函数,牛!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap