Фильтр при вводе в ячейку

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

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

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


person Przemyslaw Remin    schedule 20.01.2015    source источник
comment
Я не думаю, что это возможно. С ячейками вы фактически не вносите никаких изменений в ячейку, пока не нажмете Enter. Однако с текстовым полем каждое нажатие клавиши является изменением.   -  person PermaNoob    schedule 20.01.2015
comment
Вы можете инициировать действие с помощью событий изменения. Я думаю, у вас есть события изменения для щелчка левой кнопкой мыши, щелчка правой кнопкой мыши и некоторых других вещей. Должен признать, что я немного пессимистично отношусь к вашей цели. Если VBA используется для сравнения ячейки и определенных критериев, я думаю, это можно сделать только после нажатия Enter. Но я не уверен в этом   -  person EngJon    schedule 20.01.2015
comment
Просто подумал о чем-то. Вы можете связать ячейку с текстовым полем, а затем использовать VBA, чтобы скрыть/показать текстовое поле в событии изменения выбора. вы можете поместить текстовое поле прямо над ячейкой, чтобы оно выглядело так, как будто вы печатаете в ячейке....   -  person PermaNoob    schedule 20.01.2015
comment
возможный дубликат Excel VBA: запускать макрос при редактировании   -  person Chrismas007    schedule 20.01.2015
comment
Начиная с этой демонстрации в 03:40, возможно youtu.be/mAXiZbhEfr4   -  person Đức Thanh Nguyễn    schedule 27.02.2017


Ответы (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
person Chrismas007    schedule 20.01.2015

Я пробовал вышеуказанное решение, и оно работает нормально, но очень медленно.

В столбце с 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
    
person Chris Constantinou    schedule 20.09.2018

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

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

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

person Przemyslaw Remin    schedule 20.09.2018