根据用户表单隐藏行checkbox

大家,早安,

我有一个macros,我想sorting数据。 我的工作簿中的一个button调用一个带有10个checkbox的小型用户窗体。 用户应该select他想查看的类别,然后点击sorting。 我想要的结果是只有他select显示的类别,但我得到一个全部或没有附加macros的结果。 下面是支持表单/button对类别进行sorting的macros。 我已经通过谷歌和其他几个论坛search,找不到与我的问题有关的答案! 任何帮助你可以提供将不胜感激。

谢谢!

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 

你实际上是过滤,而不是sorting。 这引发了问题,为什么不让用户使用Excel的Filterbutton和对话框呢?

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

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

我想分享@AlphaFrog为我提供的解决scheme,它完美的工作:

 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