是否可以根据我在单元格中键入的值动态过滤行?假设我有一个数据A10:A1000
的列范围,我根据我在A1
单元格中输入的条件过滤该范围。
我希望过滤器在运行时动态响应,因为我正在键入,而不是在我按[Enter]之后。我找到了一个带有文本框的解决方案。 http://www.vbforums.com/showthread.php?647621-Excel-filtering-while-typing
但是,最好,我想在不在某个文本框中的单元格中键入内容。有可能吗?
答案 0 :(得分:2)
@PermaNoob拥有最佳解决方案。当您进入"编辑"时,Excel不允许您使用VBA检查单元格的值。模式。但是,您可以在A1
上放置一个文本框并使用它来运行您的动态"搜索范围。
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
答案 1 :(得分:1)
我已经尝试了上述解决方案,并且效果很好,但速度非常慢。
在具有950行的列中,花了13秒来完成第一个字母过滤器。从第二个字母开始,速度有所提高,但是对我来说,最初的等待是无法接受的。
我最终做了以下事情:
创建了一个新列(C)以基于单元格I1的值过滤我在列A中的数据
在单元格C2: =IF(ISERR(FIND(LOWER(I$1);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
答案 2 :(得分:0)