【问题标题】:Search and filter based on InputBox entry根据 InputBox 条目搜索和过滤
【发布时间】:2019-10-01 07:40:22
【问题描述】:

我希望实现以下目标:

  1. 通过输入框接受用户输入。
  2. 在表格标题中搜索该文本。
  3. 过滤找到的列以删除所有空白单元格(只留下包含数据的单元格。)

我找到了一个脚本,给输入框,搜索表头并选择找到的单元格。

我需要将过滤找到的单元格列的步骤合并到这个步骤中。如果我记录步骤,无论我搜索什么,它都会过滤同一列,所以我认为我需要一种方法来读取找到的单元格详细信息并选择该列来过滤掉空白。

Sub Find_First()

    Dim FindString As String
    Dim Rng As Range
    FindString = Application.InputBox("Enter a Search value")
    If Trim(FindString) <> "" Then
        With Sheets("ACM").Range("B2:DA2") ' This is the table headers
            Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            If Not Rng Is Nothing Then
                Application.Goto Rng, True
            Else
                MsgBox "Nothing found"
            End If
        End With
    End If
End Sub

我现在可以使用以下代码运行它,如果我取消 InputBox,我现在得到的唯一错误是 1004(WorksheetFunction 类)错误:-

Sub Find_First()
    Dim i1 As Integer
    Dim FindString As String

    Dim Rng As Range
    Dim rngData As Range
    Set rngData = Application.Range("A2").CurrentRegion
        FindString = Application.InputBox("Enter a Search value")
        If Trim(FindString) <> "" Then
            With Sheets("ACM").Range("B2:DA2") ' This is the table headers
                Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlPart, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
                If Not Rng Is Nothing Then
                    Application.Goto Rng, True
                Else
                    MsgBox "Nothing found"
                End If
            End With
        End If

    i1 = Application.WorksheetFunction.Match(FindString, Application.Range("A2:CZ2"), 0)
    Rng.AutoFilter Field:=i1, Criteria1:="<>"

End Sub

【问题讨论】:

  • 您不会在 Internet 上找到可以为您完成所有工作的代码示例。从第一步开始并解释您具体遇到的问题,您可能会得到一个很好的答案。您是否能够制作输入框并将其输入设置为变量?你知道如何在一行中搜索你的变量吗?如果您的输入被用户拼写错误怎么办?你知道如何自动化自动过滤器吗?
  • 如果您在修补该代码时遇到问题,请向我们展示您尝试过的代码
  • 你的输入框工作了吗?或者任何失败的尝试?请阅读Why is “Can someone help me?” not an actual question?
  • 这看起来是一个很好的开始,我要为第 2 部分更改的唯一部分是 xlWholeto xlPart 这样您就可以只搜索标题中的一个单词而不是整个标题.真的,你只剩下如何完成第 3 部分了
  • 您可以查看此链接以了解如何设置过滤器。在他们的示例中,他们使用ActiveCell,但您的将是Rng mrexcel.com/forum/excel-questions/…

标签: excel vba


【解决方案1】:

看来您确实需要制定自动过滤器:

我在类似的场景中做过这个:

Dim i1 as Interger
Dim rngData as Range
Set rngData = ws.Range("A1").CurrentRegion

使用 Match 查找我匹配 FindString 的列号

i1 = Application.WorksheetFunction.Match(FindString, ws.Range("A1:CZ1"), 0)
rngData.AutoFilter Field:=i1, Criteria1:="<>"

【讨论】:

  • 谢谢布伦特,我可以用这个替换我现有的发现吗?看起来这会一次性扫描输入数据和过滤器的范围。
  • 是的,自定义您想要查看的范围。在这种情况下,我正在查看我的标题行以查找与完整标题名称完全匹配的内容。它找到文本匹配的列,然后过滤该列以包含任何非空白项。这假设您的列标题从 A1 开始。它将列定义为变量 i1,然后使用它来决定要过滤的列。如果用户可能会查找 1 个项目,然后再进行一次搜索,但不应将其合并为 1 个,那么您可能需要在过滤器之前添加一个 'ws.ShowAllData' 以防止过滤掉所需的结果。
  • 一开始在设置rngData时使用ws.Range报错。我将其更改为 Application.Range,它似乎对此感到满意。我还在搜索和过滤器中更新了它。现在发现 WorksheetFunction 类时出错(错误 1004),我找不到解决方法。
  • 嗨,布伦特,我现在可以将您的脚本与我发布的原始脚本结合起来(非常感谢)。所以现在它可以查找和过滤列。当我取消 InputBox 时,我仍然收到有关 worksheetfunction 类 (1004) 的错误,所以有些东西仍然不太正确。我将用它现在看起来的 hon 更新主线程,因为我无法将代码粘贴到这些小注释框中。
  • ws.我的代码中的引用是我如何调用我的工作表。将其更改为您为工作表设置的任何变量,以确保它始终进入正确的工作表。
猜你喜欢
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多