Скрыть строки на основе пользовательской формы
Доброе утро всем,
У меня есть макрос, который я хочу сортировать. Кнопка в моей книге вызывает небольшую пользовательскую форму с 10 флажками. Пользователь должен выбрать те категории, которые он хочет просмотреть, и выбрать сортировку. Результат, который я хочу, это только те категории, которые он выбрал для отображения, но я получаю все или ничего из прилагаемого макроса. Ниже приведен макрос, который поддерживает форму / кнопку для сортировки категорий. Я искал через Google и несколько других форумов и не могу найти ответ, имеющий отношение к моей проблеме! Любая помощь, которую вы могли бы предложить, была бы весьма признательна.
Благодаря!
- Как играть в локальный видеофайл в цикле на пользовательской форме excel?
- Excel VBA: динамический диапазон для ComboBox. Значения Rowsource не отображаются при вызове userForm из командной строки
- Можете ли вы использовать оператор if, чтобы решить, в чем UserForm помещать информацию?
- Переменная обмена Excel VBA в пределах подписки Userfrom
- Как установить FileDialog, чтобы не разрешать двойной щелчок
Private Sub cmdSort_Click() LastRow = Range("A" & Rows.Count).End(xlUp).Row If chkFE = True Then For Each cell In Range("BC4:BC" & LastRow) If UCase(cell.Value) <> "Fire Extinguishers" Then cell.EntireRow.Hidden = True End If Next End If If chkChem = True Then For Each cell In Range("BD4:BD" & LastRow) If UCase(cell.Value) <> "Chem" Then cell.EntireRow.Hidden = True End If Next End If If chkFL = True Then For Each cell In Range("BE4:BE" & LastRow) If UCase(cell.Value) <> "FL" Then cell.EntireRow.Hidden = True End If Next End If If chkElec = True Then For Each cell In Range("BF4:BF" & LastRow) If UCase(cell.Value) <> "Elec" Then cell.EntireRow.Hidden = True End If Next End If If chkFP = True Then For Each cell In Range("BG4:BG" & LastRow) If UCase(cell.Value) <> "FP" Then cell.EntireRow.Hidden = True End If Next End If If chkLift = True Then For Each cell In Range("BH4:BH" & LastRow) If UCase(cell.Value) <> "Lift" Then cell.EntireRow.Hidden = True End If Next End If If chkPPE = True Then For Each cell In Range("BI4:BI" & LastRow) If UCase(cell.Value) <> "PPE" Then cell.EntireRow.Hidden = True End If Next End If If chkPS = True Then For Each cell In Range("BJ4:BJ" & LastRow) If UCase(cell.Value) <> "PS" Then cell.EntireRow.Hidden = True End If Next End If If chkSTF = True Then For Each cell In Range("BK4:BK" & LastRow) If UCase(cell.Value) <> "STF" Then cell.EntireRow.Hidden = True End If Next End If If chkErgonomics = True Then For Each cell In Range("BL4:BL" & LastRow) If UCase(cell.Value) <> "Ergonomics" Then cell.EntireRow.Hidden = True End If Next End If Unload frmSort End Sub
- Добавление проверки в пользовательскую форму
- Excel VBA - запись нескольких значений флажков пользовательской формы в одну ячейку
- Excel VBA Userform Listbox Динамическое контекстное меню с использованием метода .OnAction
- Userform.Show на кнопке формы не распознает пользовательскую форму, получив ошибку 424
- Пользовательский календарь календаря Excel
- Текстовое поле VBA, отображающее валюту
- Excel / VBA - ошибка времени выполнения 91 возникает только после ввода и выхода из режима разработки
- Excel VBA Открыть книгу, выполнить действия, сохранить как, закрыть
Вы фактически фильтруете, а не сортируете. Что вызывает вопрос, почему бы не просто позволить пользователю кнопку и диалог Filter
Excel?
Чтобы ответить на ваш вопрос, ваш код будет работать, только если установлен флажок. Для каждого флажка, который проверен, ваш код скрывает строки для всех других категорий. Таким образом, только категория для последнего флажка будет содержать строки, показывающие
Вы можете попытаться изменить свою логику. Начните со всех скрытых строк и установите Hidden = False
для любых строк, чья категория нажата.
Я хотел поделиться решением, которое предоставил мне @AlphaFrog, он отлично работает:
Private Sub cmdSort_Click() Dim i As Long, rng As Range, arrCriteria As Variant Set rng = Rows(3) 'Headers arrCriteria = Array("Fire Extinguishers", "Chem", "FL", "Elec", "FP", _ "Lift", "PPE", "PS", "STF", "Ergonomics") Application.ScreenUpdating = False Rows.Hidden = False With Range("BC3:BL" & Range("A" & Rows.Count).End(xlUp).Row) For i = 1 To 10 If Me.Controls("CheckBox" & i) Then .AutoFilter i, arrCriteria(i - 1) Set rng = Union(rng, .SpecialCells(xlCellTypeVisible).EntireRow) .AutoFilter End If Next i .Parent.AutoFilterMode = False .EntireRow.Hidden = True rng.EntireRow.Hidden = False End With Application.ScreenUpdating = True Unload frmSort End Sub
Ссылка на исходный ответ: http://www.ozgrid.com/forum/showthread.php?t=175539