在单元格中键入时过滤

Filter while typing in a cell

是否可以根据我在单元格中键入的值动态过滤行?假设我有一个包含数据 A10:A1000 的列范围,并且我根据在 A1 单元格中输入的条件过滤该范围。

我希望过滤器在我输入时 运行 时间内动态反应,而不是在我按下 [Enter] 之后。我找到了一个带有文本框的解决方案。 http://www.vbforums.com/showthread.php?647621-Excel-filtering-while-typing

但是,我希望在单元格中而不是在某些文本框中键入内容。可能吗?

@PermaNoob 有最好的解决方案。当您处于 "edit" 模式时,Excel 不允许您使用 VBA 检查单元格的值。但是,您可以在 A1 上放置一个文本框,然后将其用于 运行 您的 "dynamic" 搜索。

Start VBA macro when editing a cell

Private Sub TextBox1_Change()
 Dim searchArea As Range, searchRow As Range, searchCell As Range
 Dim searchString As String
 Dim lastRow As Integer

 Application.ScreenUpdating = False
 searchString = "*" & LCase(TextBox1.Value) & "*"

 ' unhide rows to have the full search field when editing
 Rows.Hidden = False

 lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
 Set searchArea = Me.Range("A5", "A" & lastRow) 'Me.Range("A5").End(xlDown))
 searchArea.EntireRow.Hidden = True

 For Each searchRow In searchArea.Rows
   For Each searchCell In searchRow.Cells
     If LCase(searchCell) Like searchString Then
       searchRow.Hidden = False
       Exit For
     End If
   Next searchCell
 Next searchRow

 Application.Goto Cells(1), True
 Application.ScreenUpdating = True

End Sub

我已经尝试过上述解决方案,它工作正常但非常慢。

在 950 行的列中,执行第一个字母过滤器需要 13 秒。从第二个字母开始速度提高了,但对我来说,最初的等待是不可接受的。

我最后做了以下事情:

  1. 创建了一个新列 (C) 以根据单元格 I1 的值过滤 A 列中的数据 在单元格 C2: =IF(ISERR(FIND(LOWER(I);LOWER(A2);1));" ";"F")

  2. 中输入
  3. 创建了文本框并将其链接到单元格 I1

  4. 在VBA中添加了以下代码:

    Private Sub TextBox1_Change()
        Call Worksheet_SelectionChange(Range("I1"))
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)    
      If Not Application.Intersect(Target, Range("I1")) Is Nothing Then    
         Range(Range("C2"), Range("C2").End(xlDown)).AutoFilter Field:=1, Criteria1:="F"    
      End If    
    End Sub
    

我最终使用了基于枢轴 tables 的解决方案。它过滤文件中的数百个项目,在输入每个字母后缩小结果范围。更重要的是,它允许 select 多个项目。

我将项目列表放入枢轴的页面过滤器table。为了美观,您可以将整行隐藏在页面过滤器下方,这样它甚至看起来不像一个枢轴 table,而只是一个 type/drop-down select 值的单元格。