2018年3月15日木曜日

【マクロ】オートフィルター

✦集計シートの値でテーブル1をフィルターかける。

Dim sh1, sh2 As Worksheet
Set sh1 = Sheets("集計")
Set sh2 = Sheets("テーブル1")
If sh1.Range("A1") <> "" Then
sh2.Select
Selection.AutoFilter Field:=8, Criteria1:="=*" & sh1.Range("A1").Value & "*", Operator:=xlAnd
End If


------------------------------------------------------------------------------

✦アクティブなセルから100行までの空白以外でフィルターをかける。

Range(Selection, Selection.Offset(100, 0)).Select
Selection.AutoFilter Field:=1, Criteria1:="<>"

------------------------------------------------------------------------------

✦上の応用で1行目にフィルターを入れてアクティブセルの空白以外を絞り
 コピーする。

If Intersect(ActiveCell, Range("A1:Z1")) Is Nothing Then Exit Sub
With Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column).End(xlUp))
.AutoFilter Field:=1, Criteria1:="<>"
.Copy
End With

------------------------------------------------------------------------------

✦シート2の特定セルの値でシート1表のフィルターをかける。
 この場合、シート2のB4・C4・D4の値でシート1を絞る。

With Sheets("Sheet1").Range("A1").CurrentRegion
.AutoFilter Field:=2, Criteria1:=Sheets("Sheet2").Cells(4, 2)
.AutoFilter Field:=7, Criteria1:=Sheets("Sheet2").Cells(4, 3)
.AutoFilter Field:=9, Criteria1:=Sheets("Sheet2").Cells(4, 4)
End With

------------------------------------------------------------------------------

✦1行目13列目で空白以外を絞り込む。

Worksheets("Sheet1").Range("A1").AutoFilter Field:=13, Criteria1:="<>"
Range("M1").Select 'コピーしたい列
With Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column).End(xlUp))
.AutoFilter Field:=1, Criteria1:="<>"
.Copy
End With

------------------------------------------------------------------------------

✦フィルターをかけて可視セルをコピーする。

Range("A1").AutoFilter Field:=13, Criteria1:="<>"
 With ActiveSheet.AutoFilter.Range
   .Resize(.Rows.Count - 1).Offset(1).Select
 End With

------------------------------------------------------------------------------

✦オートフィルターの解除

With ActiveSheet
    If .FilterMode Then .ShowAllData
End With

------------------------------------------------------------------------------

✦1行目5列目でフィルターをかけたときに値がない場合。

Range("A1").AutoFilter Field:=5, Criteria1:="<>"
If ActiveSheet.AutoFilter.Range.Columns(1) _
.SpecialCells(xlCellTypeVisible).Count = 1 Then
MsgBox "データがありません"
Else
MsgBox "データがあります"
End If

------------------------------------------------------------------------------

✦シート2でフラグを立てた値でシート1をフィルターする。
 
 シート2でフラグを立ててシート1の表を絞り込む。
 シート2の5行目にフラグ用の値があるB列で絞りたい箇所に
 1を入れてフラグを立てる。
 フラグが立った月をシート1で表を絞り込む。

Sub sample()
Dim rngs As Range, rng As Range, xAry, i As Long
With Worksheets("Sheet2")
On Error Resume Next
Set rngs = .Range("C2:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
On Error GoTo 0
End With
If Not rngs Is Nothing Then
ReDim xAry(1 To rngs.Cells.Count)
For Each rng In rngs
i = i + 1
xAry(i) = rng.Offset(, -1).Value
Next rng
Worksheets("Sheet1").Range("A:A").AutoFilter Field:=1, Criteria1:=xAry, Operator:=xlFilterValues
End If
End Sub

【シート2】フラグ用
AB
4マーク
51月1
62月
73月
84月
95月
106月
117月1
128月
139月1
1410月
1511月
1612月

【シート2】表
ABCDE
項目1項目2項目3項目4
1月
3月
41月
57月
64月
712月
89月
91月
104月
116月
126月
1311月

結果【シート1】
ABCDE
項目1項目2項目3項目4
1月
41月
57月
89月
91月

0 件のコメント:

コメントを投稿