Sub TEST1()
'フィルタする
Range("A1").AutoFilter 1, "*D*"
'シート追加
Worksheets.Add
'一旦、フィルタ結果を別セルにコピー
ActiveSheet.Next.Range("A1").CurrentRegion.Copy Range("A1")
Dim A
'フィルタ結果を配列に格納
A = Range("A1").CurrentRegion
'作業セルをクリア
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
'フィルタを解除
Range("A1").AutoFilter 1
'確認用
Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
End Sub
表を用意しておきます。
表を用意
まずは、「B」を含む値でフィルタします。
フィルタしておく
フィルタ結果を配列に格納していきます。
フィルタ結果を配列に格納していく
元のシートに影響がでないように、シートを追加します。
フィルタ結果を新規シートにコピーします。
そして、フィルタ結果を配列に格納します。
新規シートを削除します。
こんな感じで、フィルタ結果を配列に格納することができます。
あとは、フィルタの解除と配列の値を確認していきいます。
フィルタを解除します。
フィルタの解除
確認のため、配列をセルに入力します。
配列を確認
フィルタ結果を、配列に入力できていることがわかります。
SpecialCellsでループして配列に格納
次は、「SpecialCells」を使って、可視セルをループして配列に格納してみます。
手順としては、次のようになります。
可視セルの行数分だけ配列を作成
可視セルの行をループする
可視セルを行を配列に格納
では、VBAコードをみてみます。
Sub TEST2()
'フィルタ
Range("A1").AutoFilter 1, "*D*"
Dim A
'配列を作成
ReDim A(1 To Range("A1").CurrentRegion.Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
k = 0
'可視セルの行をループ
For Each B In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows
k = k + 1 'カウントアップ
For j = 1 To 2
'可視セルの値を配列に入力
A(k, j) = B.Cells(1, j)
Next
Next
'フィルタを解除
Range("A1").AutoFilter 1
'確認用
Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
End Sub
Sub TEST4()
'フィルタ
Range("A1").AutoFilter 1, "*D*"
t = Timer
Dim A
'配列を作成
ReDim A(1 To Range("A1").CurrentRegion.Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
k = 0
'可視セルの行をループ
For Each B In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows
k = k + 1 'カウントアップ
For j = 1 To 2
'可視セルの値を配列に入力
A(k, j) = B.Cells(1, j)
Next
Next
Debug.Print Timer - t & " 秒"
'フィルタを解除
Range("A1").AutoFilter 1
'確認用
Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
End Sub