Sub TEST1()
'表示している値を選択
Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
End Sub
フィルタした表を用意しておきます。
フィルタした表
では、実行してみます。
フィルタ結果を選択
選択した範囲が、とびとびになっています。
フィルタ結果のみを選択できていることがわかります。
「見出しを除く」表示セルを操作する
見出しは基本的に操作しないので、「見出しを除く」表示セルを操作してみます。
「.Resize」と「.Offset」を使って、「見出しを除く」セル範囲を選択します。
Sub TEST2()
'見出しを除いて表示している値を選択
With Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Select
End With
End Sub
フィルタした表を用意しておきます。
フィルタした表
では、VBAコードを実行してみます。
見出しを除いてフィルタ結果を選択
「見出しを除いて」フィルタ結果を選択できました。
「For Each」で1行ずつ操作
フィルタした結果を、1行ずつ操作するには、「For Each」を使って操作します。
「.Rows」で「フィルタした結果の行」を指定するのがポイントです。
Sub TEST3()
With Range("A1").CurrentRegion
'見出しを除いて表示している行をループ
For Each a In .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows
a.Select '選択
Next
End With
End Sub
Sub TEST4()
With Range("A1").CurrentRegion
'見出しを除いて表示している行をループ
For Each a In .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows
i = i + 1
'行の1行4列目に連番を入力
a.Cells(1, 4) = i
Next
End With
End Sub
Sub TEST5()
'「東京」でフィルタ
Range("A1").AutoFilter 2, "東京"
With Range("A1").CurrentRegion
'見出しを除いて表示している行をループ
For Each a In .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows
i = i + 1
'行の1行4列目に連番を入力
a.Cells(1, 4) = i
Next
End With
'フィルタを解除
Range("A1").AutoFilter
End Sub
表を用意しておきます。
表を用意
では、VBAコードを実行してみます。
東京に連番を入力
東京に連番を入力することができました。
オートフィルタの結果がある場合だけ操作する
オートフィルタの結果がある場合だけ操作してみます。
オートフィルタの結果がない場合に、「SpecialCells」を使うとエラーとなってしまいます。
なので、フィルタ結果があるかの判定をして、操作する必要があります。
オートフィルタの結果があるかを判定
オートフィルタの結果があるかを判定は、「SubTotal関数」を使うと便利です。
「SubTotal」で表示している数をカウント
「SubTotal」で表示している数をカウントしてみます。
セル範囲を「Range("A:A")」で「A列」を指定します。
カウントしたいので、引数には、「3」を入力します。
Sub TEST6()
'表示している行数をカウント
Debug.Print WorksheetFunction.Subtotal(3, Range("A:A"))
End Sub
Sub TEST8()
'「東京」でフィルタ
Range("A1").AutoFilter 2, "東京"
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(3, Range("A:A")) > 1 Then
With Range("A1").CurrentRegion
'見出しを除く表示している行をループ
For Each a In .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows
i = i + 1
'行の1行4列目に連番を入力
a.Cells(1, 4) = i
Next
End With
End If
'フィルタを解除
Range("A1").AutoFilter
End Sub
表を用意しておきます。
表を用意
では、VBAコードを実行してみます。
フィルタ結果を判定して連番を入力
フィルタ結果を判定して、連番を入力できました。
データなしの場合は変化なし
データなしの場合は、エラーを出さないで、変化なしとなります。
表にない「沖縄」でフィルタしてみます。
Sub TEST9()
'「沖縄」でフィルタ
Range("A1").AutoFilter 2, "沖縄"
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(3, Range("A:A")) > 1 Then
With Range("A1").CurrentRegion
'見出しを除く表示している行をループ
For Each a In .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows
i = i + 1
'行の1行4列目に連番を入力
a.Cells(1, 4) = i
Next
End With
End If
'フィルタを解除
Range("A1").AutoFilter
End Sub