1

私はこの VBA 自動フィルタリングの問題に対する解決策を探していました。どんなアイデアでも大歓迎です:

名前付き範囲「FslList」にオートフィルター基準の静的リストがあります-データワークシートの列14をオートフィルター処理するために、これを1つの次元配列に変換しました:

   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 のすべての値がフィルター対象の列に含まれているわけではないことです。したがって、オートフィルターは、リストにない基準に遭遇すると停止し、フィルタリング時に次の基準が含まれません。

私がやりたいことは、配列内の1つ以上の要素がフィルタリングされるデータの中に見つからない場合、オートフィルターが他の配列基準を使用してフィルタリングを続行することです。

編集:配列内のデータを数字(これはそうです)から文字に変更しました-現在は文字で正常に動作します。

私はコードを書き直して、提案されているように名前付き範囲を定義しようとしました:

私が配列に持っている要素(範囲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")

この例を参照してください

と を含むワークブックがSheet1ありSheet5ます。Sheet1リストがありSheet5、フィルタリングする必要があるデータがあります。ワークブックはこちらからダウンロードできます

ここに画像の説明を入力

で選択A1Sheet1、名前を付けますCriteriasFslList次に、Name Manager で呼び出される名前を作成し、数式を次のように設定します。=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 に答える