参考元:【VBA】可視セルの判定、削除、コピー、貼り付け【HiddenとSpecialCellsを使う】
https://daitaideit.com/vba-visible-cells/
可視セルの判定は、「.Hidden」を使うとできます。
例:行の可視セル判定
3行目が、可視セルかを判定するVBAコードです。
Sub TEST1()
'「3行目」が非表示かを判定
If Rows(3).Hidden Then Debug.Print "非表示"
End Sub
すべての行で、可視セルの判定
Sub TEST3()
'すべての行で非表示を探す
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If Rows(i).Hidden Then Debug.Print i & " 行目が非表示です"
Next
End Sub
すべての列で、可視セルの判定
Sub TEST4()
'すべての列で非表示を探す
For i = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
If Columns(i).Hidden Then Debug.Print i & " 列目が非表示です"
Next
End Sub
データの有無を可視セルで判定
データの有無を可視セルで判定したい場合は、「.SpecialCells」を使います。
Sub TEST6()
'データの有無を可視セルを使って判定
If Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then
Debug.Print "データがあります"
Else
Debug.Print "データがありません"
End If
End Sub
可視セルのみを削除する
やりたい内容は、可視セルを削除する方法で、「A」の値のみを削除したい、ということになります。
可視セルを削除する方法で、「A」の値のみを削除するVBAコードです。
Sub TEST7()
'「A」以外を非表示にする
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, 1) <> "A" Then
Rows(i).Hidden = True
End If
Next
'データ範囲内の、可視セルのみ削除する
With Range("A1").CurrentRegion
.Rows("2:" & .Rows.Count).SpecialCells(xlCellTypeVisible).Delete
End With
'すべての行を表示する
Rows("1:100").Hidden = False
End Sub
流れは、
「A」以外を非表示
可視セルを削除する
すべての行を表示
という感じです。
問題:データがない場合はエラーになっちゃう
対策:データ有無を可視セルで判定して削除
Sub TEST8()
'「A」以外を非表示にする
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, 1) <> "A" Then
Rows(i).Hidden = True
End If
Next
With Range("A1").CurrentRegion
'データがある場合
If .SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then
'データ範囲内の、可視セルのみを削除する
.Rows("2:" & .Rows.Count).SpecialCells(xlCellTypeVisible).Delete
End If
End With
'すべての行を表示
Rows("1:100").Hidden = False
End Sub
流れは、
「A」以外を非表示
データ有無を可視セルで判定
可視セルを削除する
すべての行を表示
という感じです。
フィルタしたデータを削除する
Sub TEST9()
'「1行目」を「A」でフィルタ
Range("A1").AutoFilter 1, "A"
'フィルタ結果を削除する
With Range("A1").CurrentRegion
.Rows("2:" & .Rows.Count).EntireRow.Delete
End With
'フィルタを解除
Range("A1").AutoFilter
End Sub
実行の手順は、
1列目を「A」でフィルタ
フィルタ結果を削除
フィルタを解除
という流れです。
問題:データがない場合はすべて消えちゃう
対策:データ有無を可視セルで判定して削除
VBAコードは、こんな感じになります。
Sub TEST10()
'「1行目」を「A」でフィルタ
Range("A1").AutoFilter 1, "A"
With Range("A1").CurrentRegion
'データがある場合
If .SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then
'フィルタ結果を削除
.Rows("2:" & .Rows.Count).EntireRow.Delete
End If
End With
'フィルタを解除
Range("A1").AutoFilter
End Sub
実行の手順は、
1列目を「A」でフィルタ
データ有無を可視セルで判定
フィルタ結果を削除
フィルタを解除
という流れです。
可視セルをコピーして貼り付け
Sub TEST11()
'「A」以外を非表示にする
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, 1) <> "A" Then
Rows(i).Hidden = True
End If
Next
'可視セルのみをコピーする
Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Range("E1")
'すべての行を表示
Rows("1:100").Hidden = False
End Sub
実行する手順は、
「A」以外を非表示
可視セルをコピー
すべての行を表示
という流れです。