大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、可視セルの判定や削除、コピー、貼り付けをするには、「.Hidden」や「.SpecialCells」を使うとできます。セルの操作をする際には、可視セルの操作が必要になってきます。VBAでの可視セルの操作についてマスターしていきましょう。

はじめに

この記事では、可視セルを判定、削除、コピーする方法についてご紹介します。

可視セルの判定は、「Hidden」を使うとできます。

可視セルのセル範囲の取得は、「SpecialCells」を使います。

非表示やフィルタした表で、データ有無を判定したい場合に、「SpecialCells」を使って判定することができます。

では、具体的なVBAコードを使って、解説していきます。

この記事を読むメリット

  • 可視セルを判定する方法がわかります。
  • 可視セルのコピーと貼り付けができます。

本記事の内容を動画でまとめています

目次から見たい項目へ移動すると便利ですよ。

目次

可視セルの判定

可視セルの判定をしてみます。

可視セルの判定は、「.Hidden」を使うとできます。

行と列の可視セルの判定

行と列の可視セルの判定をしてみます。

行の可視セル判定

3行目が、可視セルかを判定するVBAコードです。

Sub TEST1()
    
    '「3行目」が非表示かを判定
    If Rows(3).Hidden Then Debug.Print "非表示"
    
End Sub

3行目が非表示のシートを用意します。

3行目が非表示のシートを用意します

実行してみます。

結果は、非表示となって、可視セルの判定ができました

結果は、非表示となって、可視セルの判定ができました。

列の可視セル判定

3列目が、可視セル化を判定するVBAコードです。

Sub TEST2()
    
    '「3列目」が非表示かを判定
    If Columns(3).Hidden Then Debug.Print "非表示"
    
End Sub

3列目が非表示のシートを用意します。

3列目が非表示のシートを用意します

実行してみます。

結果は、非表示となって、可視セルの判定ができました

結果は、非表示となって、可視セルの判定ができました。

すべての行と列の可視セルの判定

すべての行と列の可視セルの判定してみます。

すべての行や列をループして、可視セルを判定します。

すべての行で、可視セルの判定

すべての行で、可視セルを判定するVBAコードです。

Sub TEST3()
    
    'すべての行で非表示を探す
    For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
        If Rows(i).Hidden Then Debug.Print i & " 行目が非表示です"
    Next
    
End Sub

3、4行目を非表示にしたシートを用意します。

3、4行目を非表示にしたシートを用意しました

実行してみます。

結果は、3、4行目が非表示となって、可視セルの判定ができました

結果は、3、4行目が非表示となって、可視セルの判定ができました。

すべての列で、可視セルの判定

すべての列で、可視セルの判定をするVBAコードです。

Sub TEST4()
        
    'すべての列で非表示を探す
    For i = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
        If Columns(i).Hidden Then Debug.Print i & " 列目が非表示です"
    Next
    
End Sub

2、3列目を非表示にしたシートを用意します。

2、3列目を非表示にしたシートを用意しました

実行してみます。

結果は、2、3列目が非表示となって、可視セルの判定ができました

結果は、2、3列目が非表示となって、可視セルの判定ができました。

フィルタした行も可視セルの判定ができる

オートフィルタで、「.Hidden」を使えば、フィルタした行も可視セルの判定ができます。

Sub TEST5()
    
    '「3行目」が非表示かを判定
    If Rows(3).Hidden Then Debug.Print "非表示"
    
End Sub

オートフィルタで3行目をフィルタしておきます。

フィルタする

オートフィルタで3行目をフィルタしました

実行すると、フィルタしたシートでも、可視セルの判定ができます。

フィルタ行の可視セルを判定できた

フィルタしたシートでも、可視セルの判定ができました

フィルタしたシートでも、可視セルの判定ができました。

データの有無を可視セルで判定

データの有無を可視セルで判定したい場合は、「.SpecialCells」を使います。

Sub TEST6()
    
    'データの有無を可視セルを使って判定
    If Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then
        Debug.Print "データがあります"
    Else
        Debug.Print "データがありません"
    End If
    
End Sub

データ有無の判定を、データ無しの表で実行してみます。

データ無しの判定

見出しを除く、すべてのデータを非表示にした表を用意します。

見出しを除く、すべてのデータを非表示にしたシートを用意しました

実行してみます。

結果は、データはありませんとなって、データの有無を判定できました

結果は、「データはありません」となって、データの有無を判定できました。

データ有りの判定

次は、データがある場合で、実行してみます。

データがある場合で、実行してみます

実行してみます。

結果は、データがありますとなって、データの有無を判定できました

結果は、「データがありました」となって、データの有無を判定できました。

可視セルのみを削除する

「SpecialCells」を使って、可視セルのみを削除してみます。

可視セルのみを削除する

やりたい内容は、可視セルを削除する方法で、「A」の値のみを削除したい、ということになります。

「A」の値を削除したい

可視セルを削除する方法で、「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」以外を非表示
  • 可視セルを削除する
  • すべての行を表示

という感じです。

では、実行してみます。

実行の手順

「A」以外を非表示にします。

「A」以外を非表示にします

可視セルを削除します。

可視セルを削除します

すべての行を表示します。

すべての行を表示します

これで、可視セルを削除する方法で、「A」のデータを削除できます。

「A」のデータを削除できた

可視セルを削除する方法で、「A」のデータを削除できました

可視セルを削除する方法で、「A」のデータを削除できました。

データがない場合はエラーになっちゃう

ただ、問題があって、データがない場合はエラーになっちゃう、ということです。

削除する「A」のデータがない場合で、実行してみます。

削除する「A」のデータが無い場合

削除する「A」のデータがない場合で、実行してみます

では、実行してみます。

エラーになっちゃう

実行すると、すべてのデータが非表示になります。

すべてのデータが非表示になります

データを削除するタイミングで、エラーとなってしまいます。

削除するデータがないので、エラーとなってしまいました

削除するデータがないので、エラーとなってしまいました。

データ有無を可視セルで判定して削除

データを削除したい場合は、データ有無を「可視セルで判定」して削除するといいです。

データ有無を可視セルで判定して、削除してみます。

データ有無を判定して削除したい

データ有無を可視セルで判定して、削除してみます

VBAコードは、こんな感じになります。

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」以外を非表示
  • データ有無を可視セルで判定
  • 可視セルを削除する
  • すべての行を表示

という感じです。

では、実行してみます。

実行の手順

実行すると、「A」のデータがないので、すべて非表示となります。

「A」のデータがないので、すべて非表示となります

データがないので、そのままとなります。

データがないので、そのままとなります

すべての行を表示します。

すべての行を表示します

こんな感じで、データはそのままで、エラーを回避できます。

エラーを回避できた

データはそのままで、エラーを回避できました

データはそのままで、エラーを回避できました。

フィルタしたデータを削除する

次は、フィルタしたデータを削除するというのをやってみます。

フィルタしたデータを削除

やりたい内容は、オートフィルタを使って、「A」のデータを削除したい、ということになります。

オートフィルタを使って「A」を削除したい

オートフィルタを使って、「A」のデータを削除してみます

VBAコードは、こんな感じになります。

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」でフィルタ
  • フィルタ結果を削除
  • フィルタを解除

という流れです。

では、実行してみます。

実行の手順

1列目を「A」でフィルタします。

1列目を「A」でフィルタします

フィルタ結果を、削除します。

フィルタ結果を、削除します

オートフィルタを解除します。

オートフィルタを解除します

これで、「A」のデータを削除できます。

「A」のデータを削除できた

「A」のデータを削除できました

「A」のデータを削除できました。

データがない場合はすべて消えちゃう

やっぱり、問題は、データがない場合です。

オートフィルタの場合は、データがすべて消えちゃいます。

削除する「A」のデータがない場合で、実行してみます。

削除する「A」のデータが無い場合

削除する「A」のデータがない場合で、実行してみます

では、実行してみます。

すべてのデータが削除されちゃう

「A」のデータがないので、フィルタ結果は、なしです。

「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」でフィルタ
  • データ有無を可視セルで判定
  • フィルタ結果を削除
  • フィルタを解除

という流れです。

では、実行してみます。

実行の手順

「A」のデータはないので、フィルタ結果はなしです。

「A」のデータはないので、フィルタ結果はなしです

データがないので、そのままとなります。

データがないので、そのままとなります

フィルタを解除します。

フィルタを解除します

これで、データがない場合は、データをそのままにすることができます。

データが無い場合はそのままにできた

データがない場合は、データをそのままにすることができました

データがない場合は、データをそのままにすることができました。

可視セルをコピーして貼り付け

次は、可視セルをコピーして貼り付けをしてみます。

可視セルのみをコピーして貼り付け

やりたい内容は、可視セルをコピーする方法で、「A」のデータをコピーしたい、ということになります。

「A」のデータをコピーしたい

可視セルをコピーする方法で、「A」のデータをコピーしてみます

VBAコードは、こんな感じになります。

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」以外を非表示
  • 可視セルをコピー
  • すべての行を表示

という流れです。

では、実行してみます。

実行の手順

「A」以外を非表示にします。

「A」以外を非表示にします

可視セルをコピーします。

可視セルをコピーします

すべての行を表示します。

すべての行を表示します

これで、可視セルをコピーする方法で、「A」のデータをコピーできます。

「A」のデータをコピーできた

可視セルをコピーする方法で、「A」のデータをコピーできました

可視セルをコピーする方法で、「A」のデータをコピーできました。

オートフィルタを使うと便利

可視セルをコピーしたい場合は、オートフィルタを使うとかなり便利になります。

「.SpecialCells」を使わなくてもできます。

オートフィルタを使って、「A」のデータをコピーしてみます。

オートフィルタを使って「A」のデータをコピーしたい

オートフィルタを使って、「A」のデータをコピーしてみます

VBAコードは、こんな感じになります。

Sub TEST12()
    
    '「1行目」を「A」でフィルタ
    Range("A1").AutoFilter 1, "A"
    
    'フィルタ結果をコピーする
    Range("A1").CurrentRegion.Copy Range("E1")
    
    'フィルタを解除
    Range("A1").AutoFilter
    
End Sub

実行する手順は、

  • 1列目を「A」でフィルタ
  • フィルタ結果をコピー
  • フィルタを解除

という感じです。

では、実行してみます。

実行の手順

1列目を「A」でフィルタします。

1列目を「A」でフィルタします

フィルタ結果をコピーします。

フィルタ結果をコピーします

オートフィルタを解除します。

オートフィルタを解除します

これで、オートフィルタを使って、「A」のデータをコピーできます。

「A」のデータをコピーできた

オートフィルタを使って、「A」のデータをコピーできました

オートフィルタを使って、「A」のデータをコピーできました。

おわりに

この記事では、可視セルを判定、削除、コピーする方法についてご紹介しました。

可視セルの判定は、「Hidden」を使うとできます。

可視セルのセル範囲の取得は、「SpecialCells」を使います。

非表示やフィルタした表で、「データ有無を判定」したい場合に、「SpecialCells」を使って判定することができます。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す