Excel “基于用户表单隐藏行”复选框
各位早上好, 我有一个宏,我想对数据进行排序。我的工作簿中的一个按钮调用一个带有10个复选框的小用户表单。用户应该选择他想要查看的类别,然后单击“排序”。我想要的结果只是他选择要显示的类别,但我从附加的宏中得到一个全有或全无的结果。下面是支持表单/按钮对类别进行排序的宏。我在谷歌和其他几个论坛上搜索过,找不到与我的问题相关的答案!如果您能提供任何帮助,我们将不胜感激 谢谢Excel “基于用户表单隐藏行”复选框,excel,sorting,checkbox,userform,vba,Excel,Sorting,Checkbox,Userform,Vba,各位早上好, 我有一个宏,我想对数据进行排序。我的工作簿中的一个按钮调用一个带有10个复选框的小用户表单。用户应该选择他想要查看的类别,然后单击“排序”。我想要的结果只是他选择要显示的类别,但我从附加的宏中得到一个全有或全无的结果。下面是支持表单/按钮对类别进行排序的宏。我在谷歌和其他几个论坛上搜索过,找不到与我的问题相关的答案!如果您能提供任何帮助,我们将不胜感激 谢谢 Private Sub cmdSort_Click() LastRow = Range("A" & Rows.Co
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
Private Sub cmdSort\u Click()
LastRow=范围(“A”和Rows.Count).End(xlUp).Row
如果chkFE=True,则
对于范围内的每个单元格(“BC4:BC”和LastRow)
如果UCase(单元格值)“灭火器”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkChem=True,则
对于范围内的每个单元格(“BD4:BD”和LastRow)
如果UCase(单元格值)“Chem”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkFL=True,则
对于范围内的每个单元格(“BE4:BE”&LastRow)
如果UCase(单元格值)“FL”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkElec=True,则
对于范围内的每个单元格(“BF4:BF”和LastRow)
如果UCase(cell.Value)“Elec”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkFP=True,则
对于范围内的每个单元格(“BG4:BG”和LastRow)
如果UCase(cell.Value)“FP”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkLift=True,则
对于范围内的每个单元格(“BH4:BH”和LastRow)
如果UCase(单元格值)“提升”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkPPE=True,则
对于范围内的每个单元格(“BI4:BI”和LastRow)
如果UCase(cell.Value)“PPE”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkPS=True,则
对于范围内的每个单元格(“BJ4:BJ”和LastRow)
如果UCase(cell.Value)“PS”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkSTF=True,则
对于范围内的每个单元格(“BK4:BK”和LastRow)
如果UCase(cell.Value)“STF”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
如果chkErgonomics=True,则
对于范围内的每个单元格(“BL4:BL”和LastRow)
如果UCase(单元格值)“人体工程学”,则
cell.EntireRow.Hidden=True
如果结束
下一个
如果结束
卸载frmSort
端接头
您实际上是在筛选,而不是排序。这就提出了一个问题,为什么不让用户直接使用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
链接到原始答案:
我尝试了相反的方法,但仍然存在同样的问题。我从来没有得出一个合乎逻辑的解释,因为这对我来说似乎是有意义的。然而,我在下面贴出了对我有用的答案。谢谢你的意见!这是一个很好的答案。过滤是一种方式。请注意,交叉发布到其他网站并不被认为是一种很好的做法:。事实上,另一个论坛的每个问题都有一个链接,上面写着“我同意这些规则。”#3是你不会在没有明确说明的情况下交叉发帖。这对我来说没什么大不了的,但是如果知道的话我会很高兴的。对不起,我只是想在应该得到的地方给予表扬。下次我一定会弄清楚的。谢谢