1

我一直在寻找这个 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)))以便自动过滤器将其中的数据正确解释为字符串数组。

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

先感谢您,

4

2 回答 2

5

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

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

看这个例子

我有一个工作簿,其中有Sheet1Sheet5Sheet1有列表,Sheet5有需要过滤的数据。工作簿可以从这里下载

在此处输入图像描述

现在选择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

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

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

在此处输入图像描述

于 2013-09-18T10:50:30.860 回答
1

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

于 2013-09-18T13:41:08.623 回答