在单元格中键入时进行过滤

时间:2015-01-20 14:22:58

标签: excel vba excel-vba filtering dynamic-typing

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

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

但是,最好,我想在不在某个文本框中的单元格中键入内容。有可能吗?

3 个答案:

答案 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秒来完成第一个字母过滤器。从第二个字母开始,速度有所提高,但是对我来说,最初的等待是无法接受的。

我最终做了以下事情:

  1. 创建了一个新列(C)以基于单元格I1的值过滤我在列A中的数据 在单元格C2: =IF(ISERR(FIND(LOWER(I$1);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
    

答案 2 :(得分:0)

我最终使用了基于数据透视表的解决方案。它过滤文件上的数百个项目,并在键入每个字母后缩小结果范围。而且,它允许选择多个项目。

我将项目列表放到数据透视表的页面过滤器中。为了美观起见,您可以将整个行隐藏在页面过滤器下面,因此它甚至看起来都不像数据透视表,而只是一个用于值的类型/下拉选择的单元格。

enter image description here