VBA 一个find方法的增强函数

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

Function FindPlus(SearchRange As Range, FindWhat As Variant, _
                  Optional After As Range, _
                  Optional LookIn As Variant = xlFormulas, _
                  Optional LookAt As Variant = xlPart, _
                  Optional SearchOrder As Variant = xlByRows, _
                  Optional SearchDirection As Variant = xlNext, _
                  Optional MatchCase As Variant = False, _
                  Optional MatchByte As Variant = True, _
                  Optional SearchFormat As Variant = False) As Collection

Dim FoundCell As Range ‘存放找到的单元格区域;
Dim AfterCell As Range ‘存放查找的起始单元格;
Dim FoundCol As Collection ‘存放找到单元格区域的集合;
Dim firstAddress As String ‘存放第一次找到的单元格的地址

Set FoundCol = New Collection ‘Collecion类实例化为对象

‘下面这个判断语句完成对After参数值的控制
If After Is Nothing Then
Else
  Set AfterCell = After ‘如果after参数不为空,这用提供的after参数值
End If

‘查找第一个符合条件的值
Set FoundCell = SearchRange.Find(what:=FindWhat, After:=AfterCell, _
                              LookIn:=LookIn, _
                              LookAt:=LookAt, _
                              SearchOrder:=SearchOrder, _
                              SearchDirection:=SearchDirection, _
                              MatchCase:=MatchCase, _
                              MatchByte:=MatchByte, _
                              SearchFormat:=SearchFormat)

If Not FoundCell Is Nothing Then
    firstAddress = FoundCell.Address ‘如果找到第一个值,然后把单元格地址赋值给FirstAddress变量

    ‘下面的循环是在区域里不断查找需要的值,并不断添加到FoundCol集合
    Do
      FoundCol.Add FoundCell ‘把找到的单元格赋值给FoundCol对象

      ‘根据SearchDirection参数,判断是向上搜索,还是向下搜索
      If SearchDirection = xlNext Then
        Set FoundCell = SearchRange.FindNext(After:=FoundCell)
      Else
        Set FoundCell = SearchRange.FindPrevious(After:=FoundCell)
      End If
    Loop Until (FoundCell Is Nothing) Or (FoundCell.Address = firstAddress) ‘经典用法,只要找到单元格和第一个找到的单元格地址不一样,就一直循环
End If
Set FindPlus = FoundCol ‘把集合对象赋值给函数名
End Function
时间: 2024-10-01 19:35:39

VBA 一个find方法的增强函数的相关文章

发现一个类的方法不够用时,可以使用的3种方法可以增强

A.创建子类,改写需要增强的方法B.包装设计模式//1.定义一个类,实现与被增强对象相同的接口//2.在类中定义一个变量,记住被增强对象//3.定义一个构造对象,接受被增强对象//4.覆盖想增强的方法//5.对于不想增强的方法,直接调用目标对象的方法C.使用动态代理(aop面向切面编程) //视频讲解: 方立勋javaweb30天教程-就业办16/day16avi/03-数据库连接池.avi https://pan.baidu.com/s/1eQBvrRc#list/path=%2F%E6%96

调用其他VBA工程中的过程和函数以及API函数

Excel VBA中,同一个应用程序下面包括多个工作簿,每个工作簿都有自己独立的VBAProject 在同一个VBA工程中,使用Call即可调用其他模块中的过程和函数,例如: Call Module2.Proc2 要注意:Call后面必须书写模块名或过程名,而不是双引号包起来的字符串. 当然也可以使用Excel的Application.Run “Module2.Proc2”调用另一个模块中的过程. 如果要调用另一个VBA工程中的过程和函数,Call就不好使了,需要使用Run,只不过要在模块前面加

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

JS复习—函数(函数的形参和实参没整理,函数的方法待补充,函数化编程待扩展)

函数 一.函数的定义 只定义一次,但可以被执行或调用任意次.JavaScript中函数是参数化的:函数的定义包括一个称为形参的标示符列表,这些参数在函数体中像局部变量一样工作.如果函数挂在在一个对象上,作为对象的一个属性,就称它为对象的一个方法.当通过这个对象来调用函数时,该对象就是此次调用的上下文,也就是该函数的this的值.用于初始化一个新创建的对象的函数称为构造函数. 二.函数的三种定义方式 1.函数声明: 函数声明语句实际上声明了一个变量,并把一个函数对象复制给它. function s

自己实现一个Native方法的调用

JNI 开始本篇的内容之前,首先要讲一下JNI.Java很好,使用的人很多.应用极广,但是Java不是完美的.Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问.JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互. Nati

jQuery Validate 表单验证插件----自定义一个验证方法

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script src="lib/jquery.validate.js" type="text/javascript"

自己实现简单的AOP(二)引入Attribute 为方法指定增强对象

话续前文 : 自己实现简单的AOP(一)简介 在第一篇文章中,对AOP的实现方式做了一个简单介绍.接下来,引入Attribute 为方法指定增强对象,由此实现一个简单的AOP. 注意:指定的是增强对象,“对象”,也就是说Attribute标记,标记的其实是一个对象.由此.使用多态便可轻松实现增强的扩展. 自定义的Attribute /// <summary> /// 为方法标记指定的增强对象 /// <para>指定的增强,可通过代理 DelayProxy 织入</para&

Node.js -- Router模块中有一个param方法

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: 1 Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: 1 2 3 Map the given param placeholder `name`(s) to the given

jQuery_review之使用jQuery的Ajax必须知道的,serialize、param方法以及全局函数

在项目中可能会碰到这样的几个问题: 第一个问题,我们需要实现一个基于ajax的异步程序,我们也相当的熟悉ajax中是可以通过{name:name,address:address}这种方式来进行传递参数的.但是,当任务下达的那一刻,我们发现前端的form表单非常的庞大,庞大的我没有耐心去一个一个的拼字符串. 第二个问题,我们需要将一个充满的checkbox的用户调查表传递给后台,额,难道需要我们写一个过滤器,然后通过each进行遍历,然后拼成这样的一个参数表么?如果你对jQuery的选择器比较了解