2017-01-20 1 views
3

この手順の最終目標は、 "TestData"テーブル内の "SysAccts"テーブルにリストされているユーザーを持つすべての行を削除することです「リスト」ワークシート)。Excel VBA - autofilterの条件として配列を使用します。期待される結果ではありません。

私はそれらを選択して削除できるように、それらの行を見つけるためにオートフィルターを使用しています。

これは私のコードです:

Sub ClearSystemAccts() 
    Dim wksData As Worksheet 
    Dim objDataTable As ListObject 
    Dim varSysAccts As Variant 

    Set wksData = ActiveWorkbook.Sheets("Test Data") 
    Set objDataTable = wksData.ListObjects("TestData") 
    varSysAccts = Worksheets("Lists").Range("SystemAccts") 

    With objDataTable.Range 
     'turn off the autofilters as a reset 
     .AutoFilter 
     'set the autofilter with the criteria; 
     .AutoFilter field:=2, Criteria1:=varSysAccts, Operator:=xlFilterValues 
     'Delete the entire row for the visible cells; _ 
     'skips the header but also deletes the blank row below the table. 
     .CurrentRegion.Offset(1).EntireRow.Delete 
     'turn off autofilter 
     .AutoFilter 
    End With 

End Sub 

私は、コードを実行すると、オートフィルタがテーブル内の行が表示されません。

私は、varSysAccts変数が正しく設定されていることを検証しました。

私はオートフィルタ行の基準にカーソルを合わせると、私は次を得る: Type mismatch notification

私は問題は、テーブルを配列に読み込まれたとき、それは常に動的な配列であることだと思います。しかし、テーブルは1つの列だけです。これをどうやって解決するのですか?

EDITED:以下のコメントでは、条件から配列を削除しました。今私は型の不一致を取得しませんが、フィルタはまだ行を選択しません。

+4

Array()ラッパーを使用せずに、配列として既に試してみてください。 varSysAcctsを使用する –

+3

'SystemAccts'が列であると仮定すると、' varSysAccts = Application.Transpose(Worksheets( "Lists")、Range( "SystemAccts")) '(配列を1次元配列にする) Criteria1:= varSysAccts'。 – YowE3K

+0

YowE3K、それを解決しました!私はあなたに信用を与えることができるように答えとして投稿することができますか?ありがとうございました! – DeNaeL

答えて

3

SystemAcctsが列であると仮定すると、アレイは一次元になります

varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts‌​")) 

ではなく、二次元(行X列)を使用します。

既に配列があるため、Criteria1:=Array(varSysAccts)の代わりにCriteria1:=varSysAcctsを使用する必要があります。

関連する問題