0

使用我设置的这段代码,我正在使用过滤器,它与带有复选框的用户表单相关联,以选择要过滤的内容。目前,如果我过滤一个变量,如实用程序它过滤器,但如果我移动到另一个过滤器说客户端,然后我过滤而不是给我与先前过滤的特定实用程序关联的客户端,它会清除所有内容并仅过滤客户端。

我认为解决方案可能必须处理方法:.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。是否有在排序后对列进行排序?正如您在下图中看到的那样,我希望能够对一列进行排序。在能源上说,然后在工作类型上进行排序。在此处输入图像描述

4

1 回答 1

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

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

于 2013-08-01T21:32:55.457 回答