在单元格中键入时过滤
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 秒。从第二个字母开始速度提高了,但对我来说,最初的等待是不可接受的。
我最后做了以下事情:
创建了一个新列 (C) 以根据单元格 I1 的值过滤 A 列中的数据
在单元格 C2: =IF(ISERR(FIND(LOWER(I);LOWER(A2);1));" ";"F")
中输入
创建了文本框并将其链接到单元格 I1
在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 值的单元格。
是否可以根据我在单元格中键入的值动态过滤行?假设我有一个包含数据 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 秒。从第二个字母开始速度提高了,但对我来说,最初的等待是不可接受的。
我最后做了以下事情:
创建了一个新列 (C) 以根据单元格 I1 的值过滤 A 列中的数据 在单元格
C2: =IF(ISERR(FIND(LOWER(I);LOWER(A2);1));" ";"F")
中输入
创建了文本框并将其链接到单元格 I1
在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 值的单元格。