2012-06-01 6 views
30

Excelで自動フィルタを設定していて、1つの列のすべての可視データをVBAコードでループしたい場合、これを行う最も簡単な方法は何ですか?VBAでフィルタリングされたリストをループする最も簡単な方法は?

フィルタリングされた非表示の行はすべて含めてはいけません。したがって、上から下のプレーン範囲は役に立ちません。

いいアイデアはありますか?ありがとう。

答えて

45

A1のセルにA2:A11の数字が1つあり、autofilterが1であるとします。 5より大きい数値(つまり、6,7,8,9,10)のみを表示するようにフィルタを設定しました。

このコードはのみ可視セルを出力します:ちょうど見つけ

Sub SpecialLoop() 
    Dim cl As Range, rng As Range 

    Set rng = Range("A2:A11") 

    For Each cl In rng 
     If cl.EntireRow.Hidden = False Then //Use Hidden property to check if filtered or not 
      Debug.Print cl 
     End If 
    Next 

End Sub 

はおそらくSpecialCellsとのより良い方法があるが、上記エクセル2003年に私のために働いた

EDIT

より良い方法::

Sub SpecialLoop() 
    Dim cl As Range, rng As Range 

    Set rng = Range("A2:A11") 

    For Each cl In rng.SpecialCells(xlCellTypeVisible) 
     Debug.Print cl 
    Next cl 

End Sub 
+0

すべての答えてくれてありがとうを参照してください。ヘッダ行1であると仮定Offsetを使用することをお勧めします!彼らは多かれ少なかれ同じものでした(SpecialCells(xlCellTypeVisible)を使って私が必要としていたキーでした)ので、どの答えが正しいかを選ぶのは難しいです。 – mattboy

8

A1のフィルタリングされたデータを下向きに仮定する1つの方法。

dim Rng as Range 
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible) 
... 
for each cell in Rng 
    ...  
11

私はこの例

Option Explicit 

Sub Sample() 
    Dim rRange As Range, filRange As Range, Rng as Range 
    'Remove any filters 
    ActiveSheet.AutoFilterMode = False 

    '~~> Set your range 
    Set rRange = Sheets("Sheet1").Range("A1:E10") 

    With rRange 
     '~~> Set your criteria and filter 
     .AutoFilter Field:=1, Criteria1:="=1" 

     '~~> Filter, offset(to exclude headers) 
     Set filRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow 

     Debug.Print filRange.Address 

     For Each Rng In filRange 
      '~~> Your Code 
     Next 
    End With 

    'Remove any filters 
    ActiveSheet.AutoFilterMode = False 
End Sub 
+0

これは問題を解決する良い方法です。私はあなたのアプローチが好きです。 –

+1

良い溶液Sid。しかし、私は 'SpecialCells'を使用する際には非常に注意が必要です。私は最近Excelが(連続した外観に基づいて)これらのセルの '.Address'を送信する方法のために問題に直面しました。 –

+0

@PankajJaju:申し訳ありませんが、私はあなたを取得していません。何を意味するのか説明していただけますか?おそらく例をもって? –

-1
Call MyMacro() 

ActiveCell.Offset(1, 0).Activate 

Do Until Selection.EntireRow.Hidden = False 
If Selection.EntireRow.Hidden = True Then 
ActiveCell.Offset(1, 0).Activate 
End If 
Loop 
+1

です。コードが何をしているか説明しておくと便利です。 –

関連する問題