Фильтр при наборе в ячейке
Можно ли было бы динамически фильтровать строки на основе значения, которое я печатаю в ячейке? Предположим, у меня есть диапазон столбцов с данными 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-й буквы, но для меня начальное ожидание было неприемлемым.
Я закончил тем, что сделал следующее:
Создан новый столбец (C) для фильтрации моих данных в столбце A на основе значения ячейки I1. Введите это в ячейке.
C2: =IF(ISERR(FIND(LOWER(I$1);LOWER(A2);1));" ";"F")
Создал TextBox и связал его с ячейкой 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
Я закончил тем, что использовал решение, основанное на сводных таблицах. Он фильтрует сотни элементов в файле, сужая результаты после ввода каждой буквы. Более того, он позволяет выбрать несколько предметов.
Я положил список элементов в фильтр страницы сводной таблицы. Вы можете скрыть целые строки под фильтром страницы для эстетики, чтобы он даже не выглядел как сводная таблица, а просто как ячейка для выбора типа / раскрывающегося списка значения.