繁体   English   中英

使用数组的VBA自动筛选-如果不在筛选列表中,则忽略标准

[英]VBA autofilter using an array - ignore criteria if it is not in the filtered list

我一直在寻找这个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

一旦我从数组中筛选出值-我需要删除它们

          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

我的问题是我的数据列表一直在变化,并且并非FSLArray中的所有值都在要过滤的列中。 因此,自动过滤器一旦遇到不在列表中的条件,即会停止,并且在过滤时不包括任何以下条件。

我想做的是,如果在要过滤的数据中未找到数组中的一个或多个元素,自动过滤器将继续使用其他数组条件进行过滤。

编辑:我已经将数组中的数据从数字(它)更改为字母-现在可以与字母一起正常工作。

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

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

Acc
9158
11958 (this one is not present in the list of data)
15938
15940

命名范围“ PODCustList”的定义如下:

=OFFSET(Acc,1,0,COUNTA(Settings!$C:$C)-1,1)

代码是一样的:

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

过滤后我得到的回报是仅过滤了其中包含“ 9158”元素的行。

解决:我需要通过此Criteria1:=Split(Join(Application.Transpose(PODCustArray)))运行数组Criteria1:=Split(Join(Application.Transpose(PODCustArray)))以便自动Criteria1:=Split(Join(Application.Transpose(PODCustArray)))器将其中的数据正确解释为字符串数组。

我可以修改代码,还是需要使用其他方法?

先感谢您,

我的问题是我的数据列表一直在变化,并且并非FSLArray中的所有值都在要过滤的列中。 因此,自动过滤器一旦遇到不在列表中的条件,即会停止,并且在过滤时不包括任何以下条件。

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

看这个例子

我有一个具有Sheet1Sheet5的工作簿。 Sheet1具有列表, Sheet5具有需要过滤的数据。 可以从此处下载该工作簿

在此处输入图片说明

现在,在Sheet1选择A1并为其命名,例如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

您将看到即使eee在条件列表中但不在需要过滤的列表中,该列表也会被过滤。

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

在此处输入图片说明

问题终于解决了。 与使用包含字母的字符串一起使用时的代码很好。 但是,我需要通过此Criteria1:=Split(Join(Application.Transpose(PODCustArray)))运行数组Criteria1:=Split(Join(Application.Transpose(PODCustArray)))以便自动Criteria1:=Split(Join(Application.Transpose(PODCustArray)))器将其中的数据正确解释为字符串数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM