使用数组的VBA自动筛选器 - 如果它不在筛选列表中,则忽略条件

Mr_*_*mer 1 arrays excel vba excel-vba

我一直在寻找这个VBA自动过滤问题的解决方案,任何想法都表示赞赏:

我在命名范围"FslList"中有一个静态自动筛选条件列表 - 我已将其转换为一个维度数组,用于在数据工作表中自动筛选第14列:

   Dim FSLArray As Variant
        Dim rngFSL As Range
        Set rngFSL = RawData.Worksheets(1).Range("FslList")
        FSLArray = rngFSL.Value

        With NewBook.Worksheets(1)
          .Cells.AutoFilter Field:=14, Criteria1:=Application.Transpose(FSLArray), Operator:=xlFilterValues
Run Code Online (Sandbox Code Playgroud)

一旦我过滤掉数组中的值 - 我需要删除它们

          With .AutoFilter.Range
            Set DeleteRange = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
          End With

          DeleteRange.EntireRow.Delete
          NewBook.Worksheets(1).AutoFilterMode = False
        End With
Run Code Online (Sandbox Code Playgroud)

我的问题是我的数据列表总是在变化,而且FSLArray中的所有值都不在要过滤的列中.因此,一旦遇到不在列表中的标准,自动过滤器就会停止 - 并且在过滤时不包括任何以下标准.

我想要做的是自动过滤器使用其他数组标准继续过滤,如果在要过滤的数据中找不到数组中的一个或多个元素.

编辑:我已经将我的数组中的数据从数字(它是)更改为字母 - 它现在可以正常使用字母.

我尝试重写代码并按照建议定义命名范围:

我在数组中的元素(范围C11:C14)是:

Acc
9158
11958 (this one is not present in the list of data)
15938
15940
Run Code Online (Sandbox Code Playgroud)

命名范围"PODCustList"定义如下:

=OFFSET(Acc,1,0,COUNTA(Settings!$C:$C)-1,1)
Run Code Online (Sandbox Code Playgroud)

代码是一样的:

Dim PODCustArray As Variant
Dim rngPODCust As Range
Set rngPODCust = RawData.Worksheets(1).Range("PODCustList")
PODCustArray = rngPODCust.Value

With Worksheets(1)
  .Cells.AutoFilter Field:=7, Criteria1:=Application.Transpose(PODCustArray), Operator:=xlFilterValues
Run Code Online (Sandbox Code Playgroud)

过滤后我得到的回报只是过滤了"9158"元素的行.

已解决:我需要通过此运行我的数组 - Criteria1:=Split(Join(Application.Transpose(PODCustArray)))用于自动过滤器以正确的方式将数据解释为字符串数组.

我可以调整我的代码,还是需要使用不同的方法?

先感谢您,

Sid*_*out 5

我的问题是我的数据列表总是在变化,而且FSLArray中的所有值都不在要过滤的列中.因此,一旦遇到不在列表中的标准,自动过滤器就会停止 - 并且在过滤时不包括任何以下标准.

这取决于你如何定义你的 Range("FslList")

看这个例子

我有一本工作簿,有Sheet1Sheet5.Sheet1有列表,并Sheet5有需要过滤的数据.可以从HERE下载工作簿

在此输入图像描述

现在选择A1Sheet1,并给它一个名字,说Criterias.接下来FslList,在名称管理器中创建一个名称,并将公式设置为=OFFSET(Criterias,1,0,COUNTA(Sheet1!$A:$A)-1,1)

在此输入图像描述

现在运行此代码

Option Explicit

Sub Sample()
    Dim FslList As Variant
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rngCritList As Range, rngSh5 As Range

    Set ws1 = Worksheets("Sheet5")
    Set ws2 = Worksheets("Sheet1")

    Set rngSh5 = ws1.Range("$A$1").CurrentRegion
    Set rngCritList = ws2.Range("FslList")

    FslList = rngCritList.Value

    rngSh5.AutoFilter Field:=1, _
                      Criteria1:=Application.Transpose(FslList), _
                      Operator:=xlFilterValues
End Sub
Run Code Online (Sandbox Code Playgroud)

您将看到列表即使eee在条件列表中存在但未在需要过滤的列表中进行过滤.

这是Sheet5在运行宏之后过滤的方式

在此输入图像描述