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

问题描述 投票:0回答:3

我想过滤除数组中的值以外的所有值,即“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

请帮我

excel vba excel-vba
3个回答
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


0
投票

有一种更简单的方法来实现这一点,然后使用过滤器。

Dim lRow As Long
    With ThisWorkbook.Sheets(1)

    lRow = .Range("K" & Rows.Count).End(xlUp).Row

        For i = 2 To lRow
            If .Cells(i, 11).Value = "A200" Or .Cells(i, 11).Value = "B400" Or .Cells(i, 11).Value = "C300" Then
                .Cells(i, 11).EntireRow.Hidden = True
            End If
        Next i

    End With

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
© www.soinside.com 2019 - 2024. All rights reserved.