前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel实战技巧74: 在工作表中创建搜索框来查找数据

Excel实战技巧74: 在工作表中创建搜索框来查找数据

作者头像
fanjy
发布2020-02-18 12:04:03
15.2K1
发布2020-02-18 12:04:03
举报
文章被收录于专栏:完美Excel

本文主要讲解如何创建一个外观漂亮的搜索框,通过它可以筛选数据并显示搜索结果。

如下图1所示,在数据区域上方放置有一个文本框,用来输入要搜索的文本,其名称重命名为“MySearch”;一个用作按钮的矩形形状,点击它开始搜索并显示结果;两个选项按钮窗体控件,用来选择在数据区域的哪列进行搜索。

图1

在VBE中,插入一个标准模块,输入代码:

代码语言:javascript
复制
Sub SearchData()
    Dim optButton As OptionButton
    Dim strButtonName As String
    Dim wks As Worksheet
    Dim lngField As Long
    Dim rngData As Range
    Dim vSearch As Variant
   
    '赋值工作表变量
    Set wks = ActiveSheet
   
    '取消筛选
    On Error Resume Next
    wks.ShowAllData
    On Error GoTo 0
   
    '数据区域(包括列标题)
    Set rngData = wks.Range("B5:F30")
    '对于表,可使用下面的代码
    'Set rngData = wks.ListObjects("表1").Range
   
    '获取用户要搜索的文本
    vSearch =wks.Shapes("MySearch").TextFrame.Characters.Text
    '如果搜索框为ActiveX控件,可用下面的代码
    'vSearch =wks.OLEObjects("MySearch").Object.Text
    '如果搜索框为单元格输入,可用下面的代码
    'vSearch = wks.Range("A1").Value
   
    '遍历选项按钮
    For Each optButton In ActiveSheet.OptionButtons
        If optButton.Value = 1 Then
            strButtonName = optButton.Text
            Exit For
        End If
    Next optButton
   
    '确定筛选字段
    On Error GoTo errH
    lngField = Application.WorksheetFunction.Match(strButtonName,rngData.Rows(1), 0)
    On Error GoTo 0
   
    '筛选数据
    rngData.AutoFilter Field:=lngField, _
      Criteria1:="=*" & vSearch& "*", _
      Operator:=xlAnd
     
    '清除搜索字段
   wks.Shapes("MySearch").TextFrame.Characters.Text =""
    '如果搜索框为ActiveX控件,可用下面的代码
   'wks.OLEObjects("MySearch").Object.Text = ""
    '如果搜索框为单元格输入,可用下面的代码
    'wks.Range("A1").Value =""
   
    Exit Sub
   
errH:
    MsgBox "在单元格区域" &rngData.Rows(1).Address & _
      "中,没有找到列标题["& strButtonName & "]." & _
      vbNewLine & "请检查.",vbCritical, "标题名没发现!"
End Sub

在代码中,对要搜索的文本使用了通配符,因此可以搜索部分匹配的文本。此外,对数据区域使用了“硬编码”,你可以将其修改为实际的数据区域。代码运行的结果如下图2所示。

图2

我们在上面的基础上再进行扩展,让搜索字段更多一些,如下图3所示,可以搜索含有数字的列。

图3

代码如下:

代码语言:javascript
复制
Sub SearchDataPlus()
    Dim optButton As OptionButton
    Dim strSearch As String
    Dim strButtonName As String
    Dim wks As Worksheet
    Dim lngField As Long
    Dim rngData As Range
    Dim vSearch As Variant
   
    '赋值工作表变量
    Set wks = ActiveSheet
   
    '取消筛选
    On Error Resume Next
    wks.ShowAllData
    On Error GoTo 0
   
    '数据区域(包括列标题)
    Set rngData = wks.Range("B5:F30")
    '对于表,可使用下面的代码
    'SetrngData = wks.ListObjects("表1").Range
   
    '获取用户要搜索的文本
    vSearch =wks.Shapes("MySearch").TextFrame.Characters.Text
    '如果搜索框为ActiveX控件,可用下面的代码
    'vSearch =wks.OLEObjects("MySearch").Object.Text
    '如果搜索框为单元格输入,可用下面的代码
    'vSearch = wks.Range("A1").Value
   
    '确定用户要搜索文本还是数值
    If IsNumeric(vSearch) = True Then
        strSearch = "=" & vSearch
    Else
        strSearch = "=*" &vSearch & "*"
    End If
   
    '遍历选项按钮
    For Each optButton InActiveSheet.OptionButtons
        If optButton.Value = 1 Then
            strButtonName = optButton.Text
            Exit For
        End If
    Next optButton
   
    '确定筛选字段
    On Error GoTo errH
    lngField =Application.WorksheetFunction.Match(strButtonName, rngData.Rows(1), 0)
    On Error GoTo 0
   
    '筛选数据
    rngData.AutoFilter Field:=lngField, _
      Criteria1:=strSearch, _
      Operator:=xlAnd
     
    '清除搜索字段
   wks.Shapes("MySearch").TextFrame.Characters.Text =""
    '如果搜索框为ActiveX控件,可用下面的代码
   'wks.OLEObjects("MySearch").Object.Text = ""
    '如果搜索框为单元格输入,可用下面的代码
    'wks.Range("A1").Value =""
   
    Exit Sub
   
errH:
    MsgBox "在单元格区域" &rngData.Rows(1).Address & _
      "中,没有找到列标题["& strButtonName & "]." & _
      vbNewLine & "请检查.",vbCritical, "标题名没发现!"
End Sub

在编写好代码后,将宏指定给表示按钮的矩形形状。在形状中单击右键,如下图4所示。

图4

选取“指定宏”命令,在“指定宏”对话框中选择宏名,如下图5所示。

图5

可以在此基础上进一步添加功能,例如,在搜索完成后,我想恢复原先的数据,可以在工作表中再添加一个代表按钮的矩形形状,如下图6所示。

图6

同时,编写下面的代码来链接到该矩形:

代码语言:javascript
复制
Sub ClearSearch()
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0
End Sub

至此,功能已全部实现!但细心的朋友可能发现,由于我们使用的是文本框和形状,因此会出现Excel的编辑形状线,特别是输入文本后,单击形状前,都需要在其他单元格中单击一下,才能再单击形状。这可能会带来不便!你可以使用ActiveX控件,或者直接使用单元格,或者使用快捷键来执行宏。在我们编写的代码中,有很多注释掉的代码语句,可供参考。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档