2013-02-25 4 views
1

Доброе утро, все,Скрыть строки на основе пользовательской формы checkbox

У меня есть макрос, который я хочу сортировать. Кнопка в моей книге вызывает небольшую пользовательскую форму с 10 флажками. Пользователь должен выбрать те категории, которые он хочет просмотреть, и выбрать сортировку. Результат, который я хочу, это только те категории, которые он выбрал для отображения, но я получаю все или ничего из прилагаемого макроса. Ниже приведен макрос, который поддерживает форму/кнопку для сортировки категорий. Я искал через Google и несколько других форумов и не могу найти ответ, имеющий отношение к моей проблеме! Любая помощь, которую вы могли бы предложить, была бы весьма признательна.

Спасибо!

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 

ответ

0

Я хотел бы поделиться решением, которое @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

+0

Это хороший ответ. Фильтрация - это путь. Обратите внимание, что перекрестная проводка на другие сайты не считается большой практикой: http://meta.stackexchange.com/questions/141823/why-is-cross-posting-wrong-on-an-external -site. На самом деле на другом форуме есть ссылка по каждому вопросу, который гласит: «Я согласен с этими правилами». # 3 заключается в том, что вы не будете перекрестно размещать сообщения, не указывая на это. Для меня это не очень важно, но было бы хорошо знать. –

+0

Извините, я просто пытался дать кредит там, где он должен. Я буду уверен, что в следующий раз это станет более ясным. Благодаря! – nickJR

2

Вы фактически фильтруете, а не сортируете. Что вызывает вопрос, почему бы не просто позволить пользователю кнопку и диалог Excel Filter?

Чтобы ответить на ваш вопрос, ваш код будет работать, только если установлен один Checkbox. Для каждого флажка, который проверен, ваш код скрывает строки для всех других категорий. Таким образом, только категория для последнего флажка будет содержать строки, показывающие

Вы можете попробовать изменить логику. Начните со всех скрытых строк и установите Hidden = False для любых строк, чья категория нажата.

+0

Я попробовал обратное, и тот же вопрос остался. Я так и не дождался логического объяснения этого, поскольку это, казалось, имело смысл для меня. Тем не менее, я опубликовал ответ, который работал для меня ниже. Спасибо за ваш вклад! – nickJR

Смежные вопросы