我正在尝试自动过滤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