3 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超5個贊
我認(rèn)為(通過試驗-MSDN在這里無濟(jì)于事)沒有直接的方法可以做到這一點。設(shè)置Criteria1為an Array等效于使用下拉菜單中的復(fù)選框-就像您說的那樣,它只會根據(jù)與數(shù)組中的一項相匹配的項目來過濾列表。
有趣的是,如果您具有文字值,"<>A"并且"<>B"在這些列表和過濾器上,宏記錄器將提供
Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"
哪個有效。但是,如果您同時也具有文字值"<>C",并且在記錄宏時對所有三個值進(jìn)行了過濾(使用復(fù)選框),則宏記錄器會精確地復(fù)制您的代碼,然后該代碼將失敗并顯示錯誤。我想我會把它稱為一個錯誤-使用UI可以執(zhí)行某些過濾器,而使用VBA則不能。
無論如何,回到您的問題??梢赃^濾不等于某些條件的值,但最多可以過濾兩個不適合您的值:
Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd
根據(jù)確切的問題,有幾種解決方法:
將“幫助列”與B列中的公式一起使用,然后對其進(jìn)行過濾-例如,=ISNUMBER(A2)或=NOT(A2="A", A2="B", A2="C")隨后對TRUE
如果您無法添加列,請使用具有Criteria1:=">-65535"(或比您期望的數(shù)字低的合適數(shù)字)的自動過濾器,該過濾器會過濾掉非數(shù)字值-假設(shè)這是您想要的
編寫一個VBA子來隱藏行(與自動過濾器不完全相同,但根據(jù)您的需要可能就足夠了)。
例如:
Public Sub hideABCRows(rangeToFilter As Range)
Dim oCurrentCell As Range
On Error GoTo errHandler
Application.ScreenUpdating = False
For Each oCurrentCell In rangeToFilter.Cells
If oCurrentCell.Value = "A" Or oCurrentCell.Value = "B" Or oCurrentCell.Value = "C" Then
oCurrentCell.EntireRow.Hidden = True
End If
Next oCurrentCell
Application.ScreenUpdating = True
Exit Sub
errHandler:
Application.ScreenUpdating = True
End Sub

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
使用自動篩選的選項
Option Explicit
Public Sub FilterOutMultiple()
Dim ws As Worksheet, filterOut As Variant, toHide As Range
Set ws = ActiveSheet
If Application.WorksheetFunction.CountA(ws.Cells) = 0 Then Exit Sub 'Empty sheet
filterOut = Split("A B C D E F G")
Application.ScreenUpdating = False
With ws.UsedRange.Columns("A")
If ws.FilterMode Then .AutoFilter
.AutoFilter Field:=1, Criteria1:=filterOut, Operator:=xlFilterValues
With .SpecialCells(xlCellTypeVisible)
If .CountLarge > 1 Then Set toHide = .Cells 'Remember unwanted (A, B, and C)
End With
.AutoFilter
If Not toHide Is Nothing Then
toHide.Rows.Hidden = True 'Hide unwanted (A, B, and C)
.Cells(1).Rows.Hidden = False 'Unhide header
End If
End With
Application.ScreenUpdating = True
End Sub
添加回答
舉報