在VBA中使用Find方法 (扩展用法)

在VBA中使用Find方法
fanjy 发表于 2007-2-12 13:15:00  

引言:本文是《 关于查找方法(Find方法)的应用 》和《 关于查找方法(Find方法)的应用示例补充 》的继续,介绍了Find方法的一些扩展技术。
使用VBA在工作表或单元格区域中查找某项数据时,我们通常使用For…Next循环,这在小范围中使用还可以,但应用在大量数据中查找时,会耗费较多时间。
而在Excel工作表中,通常使用菜单“编辑>>查找”命令或按Ctrl+F组合键,在“查找和替换”对话框中来迅速查找所需的数据。在VBA中,我们也能使用这种方法,这在下面的内容中介绍。
为什么要使用Find方法呢?最主要的原因是查找的速度。如果要使用VBA代码在包含大量数据的单元格区域中查找某项数据,应该使用Find方法。
例如,在工作表Sheet1的单元格IV65536中输入fanjy,然后运行下面的代码:
Sub QuickSearch()
    If Not Sheet1.Cells.Find("fanjy") Is Nothing Then MsgBox "已找到fanjy!"
End Sub
再试试下面的代码:
Sub SlowSearch()
    Dim R As Range
    For Each R In Sheet1.Cells
        If R.Value = "fanjy" Then MsgBox "已找到fanjy!"
    Next R
End Sub
比较一下两段代码的速度,可知第一段代码运行很快,而第二段代码却要执行相当长的一段时间。
关于Find方法的基本使用方法请见《 关于查找方法(Find方法)的应用》。下面介绍一些扩展Find方法的技术。
我们能够使用Find方法查找单元格区域的数据,但是没有一个方法能够返回一个Range对象,该对象引用了含有所查找数据的所有单元格,下面提供了一个FindAll函数来实现此功能。此外,Find方法的另一个不足之处是不支持通配符字符串,下面也提供了一个WildCardMatchCells函数,返回一个Range对象,引用了与所提供的通配符字符串相匹配的单元格。通配符字符串可以是有效使用在Like运算符中的任何字符串,关于Like运算符的介绍请见《 关于Like运算符的使用》一文。
- - - - - - - - - - - - - - - - - - - - -
FindAll函数
这个程序在参数SearchRange所代表的区域中查找所有含有参数FindWhat代表的值的单元格,SearchRange参数必须是一个单独的单元格区域对象,FindWhat参数是想要查找的值,其它参数是可选的且与Find方法的参数意思相同。
FindAll函数的代码如下:
Option Compare Text
Function FindAll(SearchRange As Range, FindWhat As Variant, _
    Optional LookIn As XlFindLookIn = xlValues, Optional LookAt As XlLookAt = xlWhole, _
    Optional SearchOrder As XlSearchOrder = xlByRows, _
    Optional MatchCase As Boolean = False) As Range
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 返回SearchRange区域中含有FindWhat所代表的值的所有单元格组成的Range对象
' 其参数与Find方法的参数相同
' 如果没有找到单元格,将返回Nothing.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  Dim FoundCell As Range
  Dim FoundCells As Range
  Dim LastCell As Range
  Dim FirstAddr As String
  With SearchRange
    Set LastCell = .Cells(.Cells.Count)
  End With
  Set FoundCell = SearchRange.Find(what:=FindWhat, after:=LastCell, _
    LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=SearchOrder, MatchCase:=MatchCase)
  If Not FoundCell Is Nothing Then
    Set FoundCells = FoundCell
    FirstAddr = FoundCell.Address
    Do
      Set FoundCells = Application.Union(FoundCells, FoundCell)
      Set FoundCell = SearchRange.FindNext(after:=FoundCell)
    Loop Until (FoundCell Is Nothing) Or (FoundCell.Address = FirstAddr)
  End If
  If FoundCells Is Nothing Then
    Set FindAll = Nothing
  Else
    Set FindAll = FoundCells
  End If
End Function
使用上面代码的示例:
Sub TestFindAll()
    Dim SearchRange As Range
    Dim FoundCells As Range
    Dim FoundCell As Range
    Dim FindWhat As Variant
    Dim MatchCase As Boolean
    Dim LookIn As XlFindLookIn
    Dim LookAt As XlLookAt
    Dim SearchOrder As XlSearchOrder
   
    Set SearchRange = ThisWorkbook.Worksheets(1).Range("A1:L20")
    FindWhat = "A" '要查找的文本,可根据实际情况自定
    LookIn = xlValues
    LookAt = xlPart
    SearchOrder = xlByRows
    MatchCase = False
   
    Set FoundCells = FindAll(SearchRange:=SearchRange, FindWhat:=FindWhat, _
        LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=SearchOrder, MatchCase:=MatchCase)
   
    If FoundCells Is Nothing Then
        Debug.Print "没有找到!"
    Else
        For Each FoundCell In FoundCells.Cells
            Debug.Print FoundCell.Address, FoundCell.Text
        Next FoundCell
    End If
   
End Sub
上面的代码中,列出了查找区域中含有所要查找的数据的所有单元格的地址以及相应文本。不仅可以找出所有含有所查找数据的单元格地址,而且也可以对这些单元格进行一系列操作,如格式化、更改数据等。
- - - - - - - - - - - - - - - - - - - - -
WildCardMatchCells函数
这个程序查找参数SearchRange所代表的区域中所有单元格,使用Like运算符将它们的值与参数CompareLikeString所代表的值比较。参数SearchRange必须是一个单独的区域,参数CompareLikeString是想要比较的文本的格式。该函数使用单元格的Text属性而不是Value属性。可选参数SearchOrder和MatchCase与Find方法中的参数意义相同。
该函数返回一个Range对象,该对象包含对与参数CompareLikeString相匹配的所有单元格的引用。如果没有匹配的单元格,则返回Nothing。
因为Find方法不支持通配符,程序将循环所有的单元格,因此对于包含大量数据的区域,执行时间可能是一个问题。并且,如果参数MatchCase为False或忽略该参数,文本在程序中必须被转换成大写,以便于查找时不区分大小写(即“A”=“a”),因此,此时程序运行将更慢。
WildCardMatchCells函数的代码如下:
Function WildCardMatchCells(SearchRange As Range, CompareLikeString As String, _
    Optional SearchOrder As XlSearchOrder = xlByRows, _
    Optional MatchCase As Boolean = False) As Range
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 本程序返回文本值与通配符字符串相匹配的单元格引用
' 返回SearchRange区域中所有相匹配的单元格
' 匹配的条件是参数CompareLikeString
' 使用了VBA中的LIKE运算符
' 如果没有相匹配的单元格或指定了一个无效的参数,则返回Nothing.
'
' 参数SearchOrder指定查找的方向;逐行还是逐列(SearchOrder:=xlByRows或SearchOrder:=xlByColumns
' 参数MatchCase指定是否区分大小写(MatchCase:=True, "A" <> "a")或(MatchCase:=False,"A" = "a").
'
' 不需要在模块顶指定"Option Compare Text",如果指定的话,将不会正确执行大小写比较
'
' 执行单元格中的Text属性比较,而不是Value属性比较
' 因此,仅比较显示在屏幕中的文本,而不是隐藏在单元格中具体的值
'
' 如果参数SearchRange是nothing或多个区域,则返回Nothing.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  Dim FoundCells As Range
  Dim FirstCell As Range
  Dim LastCell As Range
  Dim RowNdx As Long
  Dim ColNdx As Long
  Dim StartRow As Long
  Dim EndRow As Long
  Dim StartCol As Long
  Dim EndCol As Long
  Dim WS As Worksheet
  Dim Rng As Range

' 确保参数SearchRange不是Nothing且是一个单独的区域
  If SearchRange Is Nothing Then
    Exit Function
  End If
  If SearchRange.Areas.Count > 1 Then
    Exit Function
  End If

  With SearchRange
    Set WS = .Worksheet
    Set FirstCell = .Cells(1)
    Set LastCell = .Cells(.Cells.Count)
  End With

  StartRow = FirstCell.Row
  StartCol = FirstCell.Column
  EndRow = LastCell.Row
  EndCol = LastCell.Column

  If SearchOrder = xlByRows Then
    With WS
      For RowNdx = StartRow To EndRow
        For ColNdx = StartCol To EndCol
          Set Rng = .Cells(RowNdx, ColNdx)
            If MatchCase = False Then
             '''''''''''''''''''''''''''''''''''
             '如果参数MatchCase是False,则将字符串转换成大写
             '执行忽略大小写的比较
             '因此,MatchCase:=False比MatchCase:=True更慢
             '''''''''''''''''''''''''''''''''''
               If UCase(Rng.Text) Like UCase(CompareLikeString) Then
                 If FoundCells Is Nothing Then
                    Set FoundCells = Rng
                 Else
                    Set FoundCells = Application.Union(FoundCells, Rng)
                 End If
               End If
              Else
                ''''''''''''''''''''''''''''''''''''''''''''''''
                ' MatchCase为真,不需要再进行大小写转换,因此更快些
                ' 这也是不需要在模块中指定"Option Compare Text"的原因
                ''''''''''''''''''''''''''''''''''''''''''''''''
                If Rng.Text Like CompareLikeString Then
                  If FoundCells Is Nothing Then
                    Set FoundCells = Rng
                  Else
                    Set FoundCells = Application.Union(FoundCells, Rng)
                  End If
                End If
            End If
        Next ColNdx
      Next RowNdx
    End With
  Else
    With WS
      For ColNdx = StartCol To EndCol
        For RowNdx = StartRow To EndRow
          Set Rng = .Cells(RowNdx, ColNdx)
          If MatchCase = False Then
            If UCase(Rng.Text) Like UCase(CompareLikeString) Then
              If FoundCells Is Nothing Then
                Set FoundCells = Rng
              Else
                Set FoundCells = Application.Union(FoundCells, Rng)
              End If
            End If
          Else
            If Rng.Text Like CompareLikeString Then
              If FoundCells Is Nothing Then
                Set FoundCells = Rng
              Else
                Set FoundCells = Application.Union(FoundCells, Rng)
              End If
            End If
          End If
        Next RowNdx
      Next ColNdx
    End With
  End If

  If FoundCells Is Nothing Then
    Set WildCardMatchCells = Nothing
  Else
    Set WildCardMatchCells = FoundCells
  End If
End Function
使用上面代码的示例:
Sub TestWildCardMatchCells()
    Dim SearchRange As Range
    Dim FoundCells As Range
    Dim FoundCell As Range
    Dim CompareLikeString As String
    Dim SearchOrder As XlSearchOrder
    Dim MatchCase As Boolean
   
    Set SearchRange = Range("A1:IV65000")
    CompareLikeString = "A?C*"
    SearchOrder = xlByRows
    MatchCase = True
   
    Set FoundCells = WildCardMatchCells(SearchRange:=SearchRange, CompareLikeString:=CompareLikeString, _
        SearchOrder:=SearchOrder, MatchCase:=MatchCase)
    If FoundCells Is Nothing Then
        Debug.Print "没有找到!"
    Else
        For Each FoundCell In FoundCells
          Debug.Print FoundCell.Address, FoundCell.Text
        Next FoundCell
    End If
End Sub
这样,在找到所需单元格后,就可以对这些单元格进行操作了。
注:本文整理自The Code Net和Chip Pearson的文章。
分类: ExcelVBA >>ExcelVBA对象模型编程>>常用对象>>Range对象
By fanjy in 2007-2-11
  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Excel Application对象应用大全 [完美Excel]本文以MSDN的技术文章《Developers Guide to the Excel 2007 Application Object》为线条,参考了一系列相关技术文章和图书资料,全面整理和总结了Application对象应用知识。 Application对象是Excel对象模型最高层级的对象,代表Excel应用程序自身,也包含组成工作簿的许多部分,包括工作簿、工作表、单元格集合以及它们包含的数据。 Application对象包含: • 应用程序设置和选项,许多选项与“选项”对话框的选项相同。 • 返回顶级对象的方法,例如ActiveCell、ActiveSheet,等等。 本文使用VBA代码示例简要介绍了与Application对象相关的经常使用的对象、方法和属性,其一些成员能够改变用户与Excel应用程序交互的方式,还能够改变应用程序的外观和式样。熟悉Application对象能够让您扩展和调整Excel的功能,以满足自已的需求。 本文主要介绍的内容如下: 从Application对象引用对象 Application对象相关的集合 • AddIns集合 • Columns集合和Rows集合 • Dialogs集合 • Sheets集合 Application对象相关的属性 • ActiveCell属性 • ActiveChart属性 • ActiveSheet属性 • ActiveWindow属性 • ActiveWorkbook属性 • RangeSelection属性 • ScreenUpdating属性 • Selection属性 • StatusBar属性 • ThisWorkbook属性 Application对象相关的方法 • FindFile方法和Dialogs集合 • GetOpenFilename方法 • GetSaveAsFilename方法 • InputBox方法 • Run方法 Application对象相关的事件 • 激活Application事件监视 使用Application对象执行其它任务 • 删除工作表而显示提示信息(DisplayAlerts属性) • 无须提示用户而保存工作表(DisplayAlerts属性) • 使用SendKeys方法发送信息到记事本 • 安排宏在指定的时间和间隔运行(OnTime方法) Application对象的其它一些属性和方法 • Caller属性 • CutCopyMode属性 • Evaluate方法 • OnKey方法 • ThisCell属性 • WorksheetFunction属性 • 改变光标显示(Cursor属性) • 获取或改变Excel窗口的状态或大小(WindowState属性) • 获取系统信息 • 自动隐藏公式栏(DisplayFormulaBar属性) • 将Excel全屏显示(DisplayFullScreen属性) • 获取Excel启动文件夹的路径(StartupPath属性) • 检测Excel的版本(Version属性) • 打开最近使用过的文档(RecentFiles属性) • 文件对话框操作(FileDialog属性) • 改变Excel工作簿的名称(Caption属性) • 调用Windows的计算器(ActivateMicrosoftApp方法) • 暂时停止宏运行(Wait方法) • 重新计算工作簿(Calculate方法) • 控制函数重新计算(Volatile方法) • 获取重叠区域(Intersect方法) • 获取路径分隔符(PathSeparator属性) • 快速移至指定位置(Goto方法) • 关闭Excel(Quit方法
第1篇 Excel基本功能 • 冻结窗格 • 名称框定位 • 区域名称显示 • 多表区域设置格式 • 自动填充功能 • 数据的格式化 • 设置数字格式 • 数据类型转换 • 自定义数字格式 • 数据的填充复制 • 数据的查找替换 • 格式查找替换 • 数据含通配符的查找 • 表格边框设置立体效果 • 如何在Excel自动扩展格式 • 如何在Excel自动套用格式 • 自定义工具栏 • 非连续区域集打印 • 设置打印标题 第2篇 使用公式和函数 • 使用简单公式计算产品销售利润 • 使用相对和绝对引用计算产品销售额与利润 • 多表区域引用 • 利用混合引用制作九九乘法表 • INDEX函数和SUMIF函数特殊情况下的易失性 • Excel公式结果的检验和验证 • 创建Excel动态名称来实现采购数据的动态引用 • 成绩检索表-Excel名称代替引用 • Excel图表使用名称 • 相对引用和混合引用定义名称 • 借用“列表”定义动态名称 • Excel工作表复制的名称问题 • 利用文本比较标识首次出现的记录 • 更改数据字母大小写 • 利用MID 函数提取身份证号码的8 位生日数字 • 使用文本提取函数进行数字分列 • 使用查找函数拆分空格分隔的数据 • 实现EAN-13条码的校验位的算法 • 利用文本查找函数进行模糊查找 • 利用SEARCHB 函数分离全半角字符 • 利用FIND 函数提取连续数字 • 统计开奖号码不重复数字个数 • 取得零件规格的最后序号 • 利用TEXT函数格式化设备编号 • 从身份证号码提取员工的生日信息 • 使用TEXT 函数显示文格式的年份 • 将数值转换为商业发票文大写金额 • 生成文大写金额 • 利用CELL 函数取得动态工作表标签名称 • 利用MOD 函数生成数字校验码 • 利用MOD 函数实现培训反馈表票数求和 • 利用取舍函数生成重复个数的自然数序列 • 按照特定条件进行取舍计算 • 利用取舍函数解决四舍六入问题 • 产生50~100 的随机整数 • 利用随机函数仅生成数字和字母 • 利用随机函数实现考试座位随机编排 • 日计帐的余额累计 • 计扣个人所得税 • 统计月末考试大于等于平均分的总分 • 利用CHAR 函数生成A~Z 序列 • 利用DATE 函数生成指定日期 • 利用运算符计算日期相差天数 • 利用日期函数计算公民年龄 • 利用日期函数计算员工退休日期 • 计算上月的天数 • 计算目标日期所在季度的最后一天 • 返回目标日期是全年的第几天 • 判断是否为闰年 • DATEDIF函数基本用法 • 利用日期函数计算员工工龄 • 计算指定日期的星期值 • 计算上月月末日期的星期 • 指定某月的第几周的天数 • 推算出指定年份的母亲节和父亲节日期 • 计算上个月的考勤天数 • 计算基金赎回入账日期 • 加班时间的累加 • 计算车间工人工时 • 员工加班时间的舍入计算 • 使用VLOOKUP 函数进行员工信息查询 • 利用HLOOKUP 函数查询产品月销售量 • 查找某员工是否登记在员工信息表 • 判断员工公积金是否重复提缴 • 查询申购基金的申购手续费 • 从成绩明细表查询学员总成绩 • 利用LOOKUP 函数实现无序查询 • 取得最后非空单元格数值 • 利用行列号函数生成永恒的序号 • 查询员工信息表所有人事信息 • 利用INDIRECT函数动态统计产品销量 • 利用OFFSET函数产生区域引用 • 利用INDEX函数隔行提取数据 • 多条件组合查询资料 • 利用INDEX函数结合MATCH函数进行向左查找 • 实现根据学员成绩查询等级 • 确定工资单最后一名员工的位置 • 根据工资表生成工资条 • 利用CHOOSE函数重新生成内存数组 • 利用查找函数进行多表数据标识 • 实现多区域联合判断求值 • VLOOKUP函数实现向左查询 • 从生产配件编号提取连续的数字编码 • 利用MATCH 函数提取连续数值 • 查询并汇总各产品销售额 • 利用MATCH函数汇总最后3 天的产品销售额 • 利用RANK函数实现按班级进行动态排名 • 利用COUNT函数统计培训反馈表的平均票数 • 动态引用商品进货明细表 • 统计培训课程表各部门的授课数 • 统计进货量大于5小于10的型号数量 • 标注各种水果第1次出售日期 • 查询重复输入员工身份证 • COUNTIF函数使用通配符统计示例 • 汇总指定公司的产品季度销量 • 统计二季度手机销量情况 • 利用SUMIF 函数实现多表汇总 • 按区间统计数值个数 • 学员英语成绩分段统计人数 • 计算比赛评分表频率最高的分值 • 利用极值函数限定销售价格 • 取得不重复的第2 个最低报价 • 统计各科成绩大于等于平均分的总平均分 • 计算体操比赛的选手得分 • 统计年度培训完成情况表 • 在筛选条件下生成连续序号 • 按学员成绩进行排名 • 根据比赛成绩实现国式排名 • 根据学员成绩的百分比占比划分等级 • 统计购买商品的不重复VIP 用户数 • 商品月度销量统计汇总 • 统计足彩数据最多连胜场数 • 单利与复利的比较 • 终值系数和现值系数 • 普通年金终值和现值的计算过程 • 预付年金终值和现值的计算过程 • 递延年金终值和现值的计算过程 • 年金终值系数表和年金现值系数表 • 名义利率与实际利率 • 整存整取 • 零存整取(一) • 零存整取(二) • 房屋的价值(一) • 房屋的价值(二) • 买卖房屋的利润率 • 投资经营房屋的利润率 • 多久才能拥有100万(一) • 多久才能拥有100万(二) • 孩子上大学的学费(一) • 孩子上大学的学费(二) • 孩子上大学的学费(三) • 利用Excel财务函数计算住房按揭还款计划 • 相同间隔时间序列的现金流量净现值 • 相同间隔时间序列的现金流量内部收益率 • 不规则时间序列和现金流量的净现值与内部收益率 • 考虑融资成本和再投资收益的内部收益率 • 直线折旧法 • 年限总和折旧法 • 固定余额递减折旧法 • 双倍余额递减折旧法 • 可变余额递减法的累计折旧 • 累计到第2年第3 季度期的累计折旧 • CONVERT函数的应用 • 使用CONVERT函数应注意正确书写 • 多单元格数组公式计算销售金额 • 单个单元格数组公式计算销售总额 • 两个一维数组的乘法运算 • 两个一维数组的连接运算 • 使用两个一维数组构造二维数组 • 部门评价等级转换 • 使用MMULT 函数计算产品结构指数 • 产生1-10 的自然数垂直序列和水平序列 • 等比例构造一维循环数组 • SUMIF函数对产品产量进行逐行汇总 • 利用MMULT函数实现数组累加 • 将销售明细表合并单元格填充地区名称 • 将二维数组按列转换为一维数组 • 数组公式实现单条件求和 • 计算一周内存采购的平均价格 • 统计各品牌的商品销量汇总 • 利用COUNT函数代替SUM 函数统计不重复记录 • 标识零件规格号的非法数据 • 将文大写日期转换成日期序列 • 实现按日期和客户名查询数据 • 按条件实现总表拆分到分表 • 按比赛成绩进行降序排列 • 对员工信息表员工姓名排序 • 从培训课程安排表提取讲师部门 • 从商品明细表提取唯一品牌名称 • 根据商品和品牌确定唯一品牌名称 • 多维引用示例的数据来源 • 利用INDIRECT函数返回对多表区域的引用 • 求金额最大的费用项目 • 提取无重复的水果清单 • 计算按原始股折算的某股票最高价格 • 计算用餐记录分摊实例 • 计算最好成绩和的最优成绩实例 • 跨多表条件求和 • 宏表函数取得工作表标签名称 • 标识商品销售表红色字体的记录 • 按照商品采购表的数值格式显示查询结果 • 提取指定单元格的公式表达式 • 根据立方体指定参数计算公式结果 • 提取固定字符间隔的零件规格号 第3篇 创建图表和图形 • 图表种类 • 柱形图 • 条形图 • 折线图 • 饼图 • XY散点图 • 面积图 • 圆环图 • 雷达图 • 曲面图 • 气泡图 • 股价图 • 圆柱图、圆柱图和棱锥图 • 自定义图表类型 • 线-柱图 • 两轴折线图 • 对数图 • 组合图 • 创建自定义图表 • 添加误差线 • 设置轴格式 • 分类坐标轴标签 • 空单元格的绘制方式 • 设置单个数据点格式 • 设置透明色 • 多工作表数据作图 • 添加趋势线 • 设置三维图表 • 数字条件格式 • 设置坐标轴的交点 • 使用次坐标轴 • 图表上的文本框 • 图表的组合 • Microsoft Graph图表 • 图表转为图片 • 设置自动筛选 • 添加辅助行 • 定义名称 • 数据透视图 • 使用Excel VBA • 添加水平线 • 添加垂直线 • 复合饼图 • 等高线图 • 直方图 • 排列图 • 控制图 • 动态对比图 • 动态股票图 • XY散点折线图的内插值计算 • 自选图形种类 • 插入自选图形 • 添加文本 • 自选图形绘制线条和连接符 • 旋转和翻转 • 对齐和分布 • 自动靠齐 • 设置叠放次序 • 设置组合 • 设置阴影 • 设置三维效果 • 设置超链接 • 制作室内平面图 • Excel图形 • Excel工作表背景 • 插入图片到Excel工作表 • 图片的调整 • 裁剪图片 • 旋转图片 • 设置图片的透明色 • 插入动态图片 • 制作组织结构图 • 流程图 • 循环图 • 射线图 • 棱锥图 • 维恩图 • 目标图 • 创建艺术字 • 插入剪贴画 第4篇 使用Excel进行数据分析 • 数据列表的实例 • 使用记录单为数据列表命名动态名称 • 数据列表按行排序 • 含有公式的数据排序 • 简单排序的例子 • 自定义排序 • “关系或”条件的高级筛选 • “关系与”条件的高级筛选 • 利用高级筛选选择不重复的记录 • 三个“关系或”条件的高级筛选 • 使用计算条件的Excel高级筛选 • 同时使用“关系与”和“关系或”的Excel高级筛选 • 创建分类汇总 • 列表 • Excel分列功能 • 使用“导入外部数据”功能导入标准工时数据 • Microsoft Query检索数据源 • 销售数据清单 • 定义名称创建动态数据透视表 • 分页显示数据透视表 • 使用数据列表功能创建动态数据透视表 • 按日期或时间项组合 • 按数字项组合 • 指定项组合 • 创建计算字段 • 添加下计算项 • 获取Excel数据透视表数据 • 创建复合范围的Excel数据透视表 • 数据透视图 • 模拟运算表 • 单变量求解 • 规划求解 • 分析工具库 第5篇 使用Excel的高级功能 • 设置单元格数值条件 • 设置公式条件 • 复制删除条件格式 • 应用示例 • 优先顺序 • Excel数据有效性允许的条件 • 定位复制删除Excel数据有效性 • 数据有效性的高级应用 • 数据有效性的高级应用_多表不重复输入 • 分级显示 • 合并计算 第6篇 使用Excel进行协同 • Excel单元格引用建立链接统计奖金总额 • 超链接实例 • 创建Excel动态超链接 • 发布(不)具有交互性的网页_Excel的交互性 • 创建Web查询 • Excel和ASP • Excel与XML数据 • Excel与其他应用程序共享数据 • 使用Excel工作组 第7篇 Excel自动化 • 录制宏 • VBA语言基础 • 与Excel进行交互 • Excel的自定义函数 • 如何操作Excel工作簿、工作表和单元格 • 工作表的Change事件 • 工作高亮显示行和列 • 文件保存提醒 • 关闭工作簿是恢复Excel默认设置 • 设置Excel工作簿打开时的界面 • VBA事件激活的顺序 • VBA事件的激活与禁止 • 插入命令按钮 • 使用命令按钮设置单元格格式 • 使用复选框控件制作多选调查问卷 • 使用选项按钮控件制作单项调查问卷 • 使用组合框控件制作调查问卷 • 使用文本框控件快速录入三位数字 • Excel工作簿插入用户窗体 • 在用户窗体插入控件 • 为窗体控件添加事件代码 • 用户窗体的QueryClose事件和Terminate事件
### 回答1: 在Excel,可以使用VBA代码来实现下拉选项的匹配。下拉选项通常是通过数据验证功能创建的,允许用户从预先定义的选项列表选择一个值。 首先,需要确定包含下拉选项的单元格范围,可以通过设置一个命名范围或直接引用单元格范围来实现。 然后,可以使用Worksheet_Change事件来捕捉单元格的变化,并执行相应的操作。在VBA编辑器,选择工作表对象,然后在事件下拉列表选择"Change"事件,并编写相应的VBA代码。 在Change事件的代码,可以使用VBA的Select Case语句来匹配下拉选项的值。例如: ``` Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Dim cell As Range Set rng = Range("YourNamedRange") If Not Intersect(Target, rng) Is Nothing Then ' 判断目标单元格是否在下拉选项范围内 For Each cell In rng If cell.Value = Target.Value Then ' 匹配到选项 ' 在这里编写需要执行的操作,可以是赋值、计算等 Exit Sub ' 匹配到后就退出循环 End If Next cell ' 不匹配任何选项的情况 ' 在这里编写不匹配选项时需要执行的操作 End If End Sub ``` 上述代码,"YourNamedRange"需要替换为实际的下拉选项的单元格或命名范围。在匹配到选项时,可以执行需要的操作,比如将选项的值赋给其他单元格或进行一些计算。 最后,需要注意保留VBA编辑器并保存工作簿,以确保VBA代码起作用。 通过上述VBA代码,在Excel可以实现对下拉选项的匹配操作。以上是一个基本的示例,根据具体的需求,可以对VBA代码进行进一步的调整和扩展。 ### 回答2: 在Excel,可以使用VBA(Visual Basic for Applications)来匹配下拉选项。 首先,在Excel工作,我们需要有一个下拉选项的单元格。接下来,我们打开VBA编辑器(按下Alt + F11),然后在项目资源管理器选择相关的工作簿。双击该工作簿,以打开代码窗口。 然后,我们需要编写VBA代码来实现匹配下拉选项的功能。首先,我们使用Worksheet_Change事件来监视下拉选项单元格的变化。例如,如果下拉选项位于单元格A1,则我们可以使用以下代码: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1")) Is Nothing Then '在这里编写匹配下拉选项的代码 End If End Sub 然后,我们可以使用VBA的Range对象和Find方法来在指定范围内搜索匹配项。例如,如果我们想要在单元格范围B1:B100搜索匹配项,我们可以使用以下代码: Dim rng As Range Set rng = Range("B1:B100") Dim cell As Range Set cell = rng.Find(What:=Range("A1").Value, LookIn:=xlValues, LookAt:=xlWhole) 接下来,我们可以使用VBA的If语句来检查是否找到了匹配项。如果找到了匹配项,则可以执行相应的操作,例如在另一个单元格显示匹配项或执行其他计算。 如果没有找到匹配项,我们也可以执行其他操作,例如在一个消息框显示“未找到匹配项”。 以上是一个简单的示例,展示了如何使用VBA来匹配下拉选项。根据具体需求,你可以根据这个示例进行修改和扩展。希望能对你有所帮助! ### 回答3: 在Excel,可以使用VBA代码来实现匹配下拉选项的功能。 首先,我们需要一个下拉列表框,可以通过在Excel的数据验证功能创建一个下拉列表,或者使用ActiveX控件的ComboBox来实现。 在VBA,可以使用Worksheet_Change事件来监听下拉列表的选择变化。当选择发生变化时,使用VBA代码来匹配选项。 下面是一个简单的示例代码: Private Sub Worksheet_Change(ByVal Target As Range) Dim SelectedOption As String Dim MatchingCell As Range '判断是否发生下拉列表的选择变化 If Target.Address = "$A$1" Then SelectedOption = Target.Value '在范围A2:A10查找匹配选项 Set MatchingCell = Range("A2:A10").Find(What:=SelectedOption, LookIn:=xlValues) '如果找到匹配的选项,则将其值填入B1单元格 If Not MatchingCell Is Nothing Then Range("B1").Value = MatchingCell.Offset(0, 1).Value Else Range("B1").Value = "未找到匹配选项" End If End If End Sub 在上述代码,假设下拉列表位于A1单元格,目标匹配范围为A2:A10。当选择发生变化时,获取所选选项的值,并在范围A2:A10查找匹配选项。如果找到匹配选项,则将其相邻单元格的值填入B1单元格;如果未找到匹配选项,则在B1单元格显示"未找到匹配选项"。 通过以上代码,可以实现在Excel使用VBA匹配下拉选项的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值