Excel中的AutoFilter以降序排列,而不是以vba为空

时间:2016-04-04 15:33:09

标签: excel vba excel-vba sorting

我正在尝试自动过滤excel中的列表,但是我遇到了一些过滤升级而不是空行的问题。

我有一张excel表(ws1),有50列和几百行。

所以我遍历ws1中的所有列并将其与我在第二个excel表(ws2)中指定的文本进行比较,如果这是X,升序,降序,自由文本,对于相应的列我不会为空过滤它。

所以大部分都有效,如果是X则显示列:

  For i = 1 To lColumn1
        If IsEmpty(ws2.Cells(i + 1, columFilter)) Then
            ws1.Cells(rowheader1, i).Columns.EntireColumn.Hidden = True
        Else
            ws1.Cells(rowheader1, i).Columns.EntireColumn.Hidden = False
            On Error Resume Next
            If Not UCase(ws2.Cells(i + 1, columFilter)) = "X" Then

对于降序,它不适用过滤器:

 ElseIf UCase(ws2.Cells(i + 1, columFilter)) = "DESCENDING" Then
 With ws1.AutoFilter.Sort
     .SortFields.Add key:=Range(Cells(rowheader1, i), Cells(lastRowVal, i)), SortOn:=xlSortOnValues, Order:=xlDescending, _
                                        DataOption:=xlSortNormal
      .Apply
  End With
 ws1.ApplyFilter

lastRowVal是工作表中的最后一行:lastRowVal = ws1.Cells(ws1.Rows.Count,“C”)。End(xlUp).row(也许使用usedrange代替?)

我也想应用一个排序crietria,它显示所有非空白的行:

 ElseIf UCase(ws2.Cells(i + 1, columFilter)) = "NOTEMPTY" Then
 With ws1.AutoFilter.Sort
     .SortFields.Add key:=Range(Cells(rowheader1, i), Cells(lastRowVal, i)), SortOn:=xlSortOnNONBLANKS, _
                                        DataOption:=xlSortNormal
      .Apply
  End With
 ws1.ApplyFilter

下面几乎是宏的整个代码:

Sub Custom_Button_Click(Optional ByVal simulateButton As Boolean = False)
    Dim columnHeader As String
    Dim ws1, ws2 As Worksheet
    Dim wb, wb2 As Workbook
    Dim closefilter As Boolean
    closefilter = True

    'set the worksheet we will be dealing with
    Set wb = ActiveWorkbook
    Set ws1 = wb.Sheets("List")
    closefilter = FileHandling.setWorksheetFilter(wb2, ws2)

    On Error Resume Next

    Call Unhide_All_Columns
    ws1.AutoFilter.Sort.SortFields.Clear
    If Not simulateButton Then
        columnHeader = CStr(ws1.Shapes(Application.Caller).Name)

        If Not ThisWorkbook.buttonActive = "" Then
            ws1.Shapes.Range(Array(ThisWorkbook.buttonActive)).Select
            With Selection.Font
                .ColorIndex = 1
            End With
        End If

        If Not columnHeader = "ShowGUI" Then
            ws1.Shapes.Range(Array(columnHeader)).Select
            With Selection.Font
                .ColorIndex = 50
            End With
        End If

        If Not columnHeader = "ShowGUI" Then
            ThisWorkbook.buttonActive = columnHeader
        End If
    Else
        columnHeader = ThisWorkbook.buttonActive
    End If


    Dim rng As Range


    lastRowVal = ws1.Cells(ws1.Rows.Count, "C").End(xlUp).row
    'Set range from which to determine largest value
    Set rng = ws1.Range(ws1.Cells(1, 1), ws1.Cells(lastRowVal, 1))


    rowheader1 = counter.getHeaderRow(ws1)

    columFilter = HelpFunctions.getColumn(columnHeader, ws2, 1)

    lColumn1 = ws1.Cells(rowheader1, Columns.Count).End(xlToLeft).column
    For i = 1 To lColumn1
        If IsEmpty(ws2.Cells(i + 1, columFilter)) Then
            ws1.Cells(rowheader1, i).Columns.EntireColumn.Hidden = True
        Else
            ws1.Cells(rowheader1, i).Columns.EntireColumn.Hidden = False
            On Error Resume Next
            If Not UCase(ws2.Cells(i + 1, columFilter)) = "X" Then
                If UCase(ws2.Cells(i + 1, columFilter)) = "ASCENDING" Then
                   With ActiveWorkbook.Sheets("List").AutoFilter.Sort
                        .SortFields.Add key:=Range(Cells(rowheader1, i), Cells(lastRowVal, i)), SortOn:=xlSortOnValues, Order:=xlAscending, _
                                        DataOption:=xlSortNormal
                        .Apply
                    End With
                    ws1.ApplyFilter

                ElseIf UCase(ws2.Cells(i + 1, columFilter)) = "DESCENDING" Then
                    With ws1.AutoFilter.Sort
                        .SortFields.Add key:=Range(Cells(rowheader1, i), Cells(lastRowVal, i)), SortOn:=xlSortOnValues, Order:=xlDescending, _
                                        DataOption:=xlSortNormal
                        .Apply
                    End With
                    ws1.ApplyFilter

                 ElseIf UCase(ws2.Cells(i + 1, columFilter)) = "LAST" Then

                    ws1.AutoFilter.Sort.SortFields.Clear
                    ws1.Range("A1").AutoFilter Field:=1, Criteria1:=LastRow

                Else
                    ws1.Range("A1").AutoFilter Field:=i, Criteria1:=ws2.Cells(i + 1, columFilter).Value
                End If
            End If
        End If
    Next i



    'close da shit
    If closefilter Then
       Call FileHandling.closeWorksheetFilter(wb2, ws2)
    End If

    ws1.Cells(1, 1).Select
    Set ws1 = Nothing
End Sub



Sub Unhide_All_Columns()

'Clears filters on the activesheet. Will not clear filters if the sheet is protected.
    On Error Resume Next
    If ActiveWorkbook.ActiveSheet.FilterMode Or ActiveWorkbook.ActiveSheet.AutoFilterMode Then
       ActiveWorkbook.ActiveSheet.ShowAllData
    End If

     'in case the sheet is protected
    ActiveWorkbook.Sheets("List").Cells.EntireColumn.Hidden = False


    ActiveSheet.Shapes.Range(Array("All")).Select
    With Selection.Font
        .ColorIndex = 50
    End With


    If Not ThisWorkbook.buttonActive = "" Then
        ActiveSheet.Shapes.Range(Array(ThisWorkbook.buttonActive)).Select
        With Selection.Font
            .ColorIndex = 1
        End With
    End If


    ThisWorkbook.buttonActive = "All"
    ActiveWorkbook.Sheets("List").Range("A1").Select

Protection:
If Err.Number = 1004 And Err.Description = _
    "ShowAllData method of Worksheet class failed" Then
    'MsgBox "Unable to Clear Filters. This could be due to protection on the sheet.", _
    'vbInformation
End If

End Sub

0 个答案:

没有答案