根据以前的过滤器进行过滤

时间:2013-07-31 22:42:25

标签: excel vba excel-vba excel-2010

使用此代码我已设置我使用的过滤器与userforms相关联,并带有复选框以选择要过滤的内容。目前,如果我过滤一个变量,如Utilities it Filters,但如果我移动到另一个过滤器说Clients然后我过滤而不是给我与之前过滤的特定实用程序相关联的客户端它清除所有内容并仅过滤客户端。

我在想解决方案可能需要处理方法: .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。是否有排序后对列进行排序?正如你在下面的图片中看到的那样,我希望能够对一个列进行排序。在能源上说然后在工作类型上排序。 enter image description here

1 个答案:

答案 0 :(得分:2)

我不打算重新编写代码,但我可以提供实现您想要的信息和方法。

目前,您专注于一个专栏:

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

您应该将其扩展到整个表区域:

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

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

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

过滤器会累积,因此以下内容将过滤两列:

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

在某些时候,您将清除过滤器:

ActiveSheet.ShowAllData

清除单个过滤器只是应用没有标准的过滤器:

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

如果您在多个列上录制宏排序(使用自定义排序),则会创建如下代码,我已添加了一些注释:

'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

录制宏还会显示可能对您有用的其他方法和属性。录制的代码不会很优雅,并且可以显着减少(整理),但它确实提供了有用的信息。