2015-01-20 7 views
0

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

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

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

+0

Я не думаю, что это возможно. С помощью ячеек вы фактически не вносите никаких изменений в ячейку, пока не нажмете enter. Однако с текстовым полем каждое нажатие клавиши является изменением. – PermaNoob

+0

Вы можете активировать действие с помощью событий изменения. У вас есть события изменения для щелчка левой кнопкой мыши, щелчка правой кнопкой мыши и некоторые другие вещи, которые я предполагаю. Должен признаться, я слегка пессимистичен в отношении вашей цели. Если VBA используется для сравнения ячейки и определенного критерия, я думаю, что это можно сделать только после нажатия Enter. Но я не уверен в этом – EngJon

+0

Просто подумал о чем-то. Вы можете связать ячейку с текстовым полем, а затем использовать VBA, чтобы скрыть/показать текстовое поле в событии изменения выбора. вы можете разместить текстовое поле прямо над ячейкой, чтобы оно выглядело так, как будто вы вводите в ячейку .... – PermaNoob

ответ

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