基于之前的filter进行过滤

使用这个代码,我已经设置了我使用筛选器与用户窗体相关的checkbox来select要筛选的内容。 目前,如果我过滤一个variables,如实用程序filter,但如果我移动到另一个filter说客户端,然后我过滤,而不是给我的客户端与以前过滤特定的实用工具相关联的filter清除所有内容,只在客户端filter。

我想这个解决scheme可能要处理的方法:.SpecialCells(xlCellTypeVisible)

Private Sub Cancel_UF_Click() UtilityFilter.Hide Range("A1").Select End Sub Private Sub Confirm_UF_Click() ActiveSheet.Unprotect ("UMC626") ClearFilter UpdateFilters UtilityFilter.Hide Application.ScreenUpdating = False Range("A1").Select ActiveSheet.Protect Password:="UMC626", _ DrawingObjects:=False, _ Contents:=True, _ Scenarios:=True End Sub Sub SelectAll_UF_Click() If SelectAll = True Then Electricty_UF.Value = True Gas_UF.Value = True NonUtility_UF.Value = True SolarElectricity_UF.Value = True SolarThermal_UF.Value = True SolidWaste_UF.Value = True Water_UF.Value = True Else Electricity_UF.Value = False Gas_UF.Value = False NonUtility_UF.Value = False SolarElectricity_UF.Value = False SolarThermal_UF.Value = False SolidWaste_UF.Value = False Water_UF.Value = False End If End Sub Sub UpdateFilters() Integer_UF = -1 If Electricity_UF.Value = True Then Add_UF String_UF, "E" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If Gas_UF.Value = True Then Add_UF String_UF, "G" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If NonUtility_UF.Value = True Then Add_UF String_UF, "NU" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If SolarElectricity_UF.Value = True Then Add_UF String_UF, "SE" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If SolarElectricity_UF.Value = True Then Add_UF String_UF, "SE" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If SolarThermal_UF.Value = True Then Add_UF String_UF, "ST" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If SolidWaste_UF.Value = True Then Add_UF String_UF, "SW" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If If Water_UF.Value = True Then Add_UF String_UF, "W" Range("E6:E67").AutoFilter Field:=1, _ Criteria1:=String_UF, _ Operator:=xlFilterValues End If End Sub Sub Add_UF(String_UF() As String, NewValue As String) Integer_UF = Integer_UF + 1 ReDim Preserve String_UF(Integer_UF) String_UF(Integer_UF) = NewValue End Sub 

我认为重点应该放在Add_UF上,我称之为NewValue。 是否有sorting后列进行sorting? 正如你在下面的图片中看到的,我希望能够sorting一个柱子。 然后说能量然后按工作typessorting。 在这里输入图像说明

我不打算重写你的代码,但是我可以提供你需要的信息和方法来实现你想要的。

目前您正在专注于单列:

 Range("E6:E67").AutoFilter Field:=1, _ 

你应该把它扩展到整个桌子区域:

 ActiveSheet.Range("$A$5:$M$112").AutoFilter Field:=6, Criteria1:="Leeds" 

数字6是filter范围内的第六列。 您也可以创build一个Range引用来引用filter范围:

 Dim rngFilter As Range Set rngFilter = Worksheets("Staff List").AutoFilter.Range 

积累的filter,所以下面将过滤两列:

 ActiveSheet.Range("$A$5:$M$112").AutoFilter Field:=6, Criteria1:="Leeds" ActiveSheet.Range("$A$5:$M$112").AutoFilter Field:=7, Criteria1:="Sales" 

在某些时候,您将清除filter:

 ActiveSheet.ShowAllData 

清除单个filter只是应用没有条件的filter:

 ActiveSheet.Range("$A$5:$M$112").AutoFilter Field:=7 

如果您录制一个macros来对多个列进行sorting(使用自定义sorting),它会创build类似以下的代码,我已经添加了一些注释:

 'clear the previous Sort ActiveWorkbook.Worksheets("Staff List").AutoFilter.Sort.SortFields.Clear 'accumulate the SortFields ActiveWorkbook.Worksheets("Staff List").AutoFilter.Sort.SortFields.Add Key:= _ Range("C6:C112"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _ :=xlSortNormal ActiveWorkbook.Worksheets("Staff List").AutoFilter.Sort.SortFields.Add Key:= _ Range("B6:B112"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _ :=xlSortNormal 'Apply the Sort With ActiveWorkbook.Worksheets("Staff List").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With 

录制macros还会显示其他可能对您有用的方法和属性。 logging的代码不会很好,可以大大减less(整理),但它提供了有用的信息。