2013-02-25 91 views
1

大家早上好,基于userform复选框隐藏行

我有一个宏,我想对数据进行排序。我的工作簿中的一个按钮调用一个包含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是你不会在没有说清楚的情况下交叉发帖。这对我来说并不是什么大不了的事情,但是知道这件事本来就不错。 – 2013-02-26 14:54:16

+0

对不起,我只是试图给出它到期的地方。我一定会确保下次更清楚。谢谢! – nickJR 2013-02-26 19:42:38

2

你实际上是筛选,而不是排序。这引发了这个问题,为什么不让用户使用Excel的Filter按钮和对话框呢?

要回答你的问题,你的代码将永远工作,如果一个Checkbox被选中。对于每个检查过的复选框,您的代码都隐藏了所有其他类别的行。因此,只有最后一个复选框的类别才会显示行

您可以尝试颠倒你的逻辑。从隐藏所有行开始,并为其类别被单击的任何行设置Hidden = False

+0

我试图反向,同样的问题依然存在。我从来没有对此做过逻辑解释,因为它对我来说似乎有意义。不过,我已在下面发布了适合我的答案。感谢您的输入! – nickJR 2013-02-26 14:37:55