使用VBA查找并在列表框中显示找到的所有匹配项

2022-04-13 13:36:15 浏览数 (1)

标签:VBA,用户窗体,列表框

有时候,我们想从数据表中搜索指定的内容,但匹配项往往不只一项,而我们想要将匹配项全部显示出来,如下图1所示。

图1

在Excel中,有很多方法可以实现,这里使用用户窗体和VBA代码来完成。

示例数据如下图2所示。

图2

单击“查找”按钮,弹出我们所设计的用户窗体如下图3所示。

图3

其中,最主要的“查找”按钮对应的代码如下:

代码语言:javascript复制
Private Sub SearchBtn_Click()
    Dim SearchTerm As String
    Dim SearchColumn As String
    Dim RecordRange As Range
    Dim FirstAddress As String
    Dim FirstCell As Range
    Dim RowCount As Integer
    ' 如果没有数据项输入则显示错误
    If FName.Value = "" AndLName.Value = "" And Location.Value = "" AndDepartment.Value = "" Then
        MsgBox "没有指定搜索项", vbCritical   vbOKOnly
        Exit Sub
    End If
    ' 找出要搜索的内容
    If FName.Value <> "" Then
        SearchTerm = FName.Value
        SearchColumn = "姓名"
    End If
    If LName.Value <> "" Then
        SearchTerm = LName.Value
        SearchColumn = "性别"
    End If
    If Location.Value <> ""Then
        SearchTerm = Location.Value
        SearchColumn = "城市"
    End If
    If Department.Value <> ""Then
        SearchTerm = Department.Value
        SearchColumn = "部门"
    End If
    Results.Clear
    ' 仅在相关表格列中搜索,即如果某人正在搜索位置,则仅在位置列中搜索
    With Range("Table1[" &SearchColumn & "]")
       ' 查找第一个匹配项
        Set RecordRange = .Find(SearchTerm,LookIn:=xlValues)
       ' 如果已找到匹配项
        If Not RecordRange Is Nothing Then
            FirstAddress = RecordRange.Address
            RowCount = 0
            Do
               ' 设置匹配值行中的第一个单元格
                Set FirstCell =Range("A" & RecordRange.Row)
               ' 添加匹配记录到列表框
                Results.AddItem
                Results.List(RowCount, 0) =FirstCell(1, 1)
                Results.List(RowCount, 1) = FirstCell(1,2)
                Results.List(RowCount, 2) =FirstCell(1, 3)
                Results.List(RowCount, 3) =FirstCell(1, 4)
                RowCount = RowCount   1
               ' 查找下一个匹配项
                Set RecordRange =.FindNext(RecordRange)
               ' 当不再找得到匹配项时, 退出过程
                If RecordRange Is Nothing Then
                    Exit Sub
                End If
               ' 在找到唯一匹配项时继续查找
              Loop While RecordRange.Address<> FirstAddress
        Else
           ' 如果到了这里,则没有找到匹配的
            Results.AddItem
            Results.List(RowCount, 0) = "没有找到"
        End If
    End With
End Sub

代码中的Table1就是工作表中表名。

vba

0 人点赞