我想过滤除数组中的值以外的所有值

时间:2018-09-04 19:11:48

标签: excel vba excel-vba

我想过滤除数组中的值以外的所有值,即“ B400”,“ A200”,“ C300”。 我尝试了以下代码,但所有代码均无效

Dim rDataRange as Range
set rDataRange = Range("A1:P1000")

rDataRange.AutoFilter Field:=11, Criteria1:="<>" & Array("B400", "A200", "C300"), Operator:=xlFilterValues

rDataRange.AutoFilter Field:=11, Criteria1:=Array("<>B400", "<>A200", "<>C300"), Operator:=xlFilterValues

请帮助我

3 个答案:

答案 0 :(得分:0)

针对您的情况进行了修改:

Option Explicit
Sub AutoFilterWorkaround()

Dim sht As Worksheet
Dim filterarr As Variant, tofindarr As Variant
Dim lastrow As Long, i As Long, j As Long, k As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

'List the parts of the words you need to find here
tofindarr = Array("B400", "A200", "C300")

ReDim filterarr(0 To 0)
j = 0

For i = 2 To lastrow
    If sht.Cells(i, 11).Value <> tofindarr(0) And _
       sht.Cells(i, 11).Value <> tofindarr(1) And _
       sht.Cells(i, 11).Value <> tofindarr(2) Then
        filterarr(j) = sht.Cells(i, 11).Value
        j = j + 1
        ReDim Preserve filterarr(0 To j)
    End If
Next i

'Filter on array
sht.Range("$A$1:$P$" & lastrow).AutoFilter Field:=11, Criteria1:=Array(filterarr), Operator:=xlFilterValues

End Sub

img1

答案 1 :(得分:0)

然后使用过滤器是一种更简单的方法来完成此操作。

true

答案 2 :(得分:0)

您仍然可以在某种反向模式中使用AutoFilter()

    Dim myRng As Range ' helper range variable

    With Range("A1:P1000") ' reference wanted range to filter, header row included
        .AutoFilter field:=11, Criteria1:=Array("B400", "A200", "C300"), Operator:=xlFilterValues ' filter on "not wanted" values
        If Application.Subtotal(103, .Resize(, 1)) > 1 Then ' if any filtered cell other than header row
            Set myRng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) ' temporarily set 'myRng' to referenced range "not wanted" rows
            .Parent.AutoFilterMode = False ' remove filters and show all rows
            myRng.EntireRow.Hidden = True ' hide referenced range "not wanted" rows, leaving "wanted" rows only visible

            With .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) ' reference referenced range "wanted" rows
                .Select
                ' do what you want with "wanted" rows
            End With

            .EntireRow.Hidden = False ' unhide all referenced range rows
        Else
            .Parent.AutoFilterMode = False ' remove filters
        End If
    End With