簡體   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