Фильтр при наборе в ячейке

Можно ли было бы динамически фильтровать строки на основе значения, которое я печатаю в ячейке? Предположим, у меня есть диапазон столбцов с данными A10:A1000 и я фильтрую этот диапазон по критериям, которые я печатаю в A1 клетка.

Я хочу, чтобы фильтр реагировал динамически, во время выполнения, когда я печатаю, а не после того, как я нажму [Enter]. Я нашел решение для этого с помощью текстового поля. http://www.vbforums.com/showthread.php?647621-Excel-filtering-while-typing

Однако желательно, чтобы я набирал текст в ячейке, а не в каком-либо текстовом поле. Является ли это возможным?

3 ответа

@PermaNoob имеет лучшее решение. Excel не позволяет проверять значение ячейки с VBA, когда вы находитесь в режиме "редактирования". Вы можете, однако, поставить текстовое поле над A1 и используйте это для запуска вашего "динамического" поиска.

Запустить макрос VBA при редактировании ячейки

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 секунд. Скорость улучшается со 2-й буквы, но для меня начальное ожидание было неприемлемым.

Я закончил тем, что сделал следующее:

  1. Создан новый столбец (C) для фильтрации моих данных в столбце A на основе значения ячейки I1. Введите это в ячейке. C2: =IF(ISERR(FIND(LOWER(I$1);LOWER(A2);1));" ";"F")

  2. Создал TextBox и связал его с ячейкой I1

  3. Добавлен следующий код в 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
    

Я закончил тем, что использовал решение, основанное на сводных таблицах. Он фильтрует сотни элементов в файле, сужая результаты после ввода каждой буквы. Более того, он позволяет выбрать несколько предметов.

Я положил список элементов в фильтр страницы сводной таблицы. Вы можете скрыть целые строки под фильтром страницы для эстетики, чтобы он даже не выглядел как сводная таблица, а просто как ячейка для выбора типа / раскрывающегося списка значения.

введите описание изображения здесь

Другие вопросы по тегам