【VBA】可視セルの判定、削除、コピー、貼り付け【HiddenとSpecialCellsを使う】

嚯嚯go發表於2024-10-02

參考元:【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」以外を非表示
可視セルをコピー
すべての行を表示
という流れです。

相關文章