和風スパゲティのレシピ

日本語でコーディングするExcelVBA

行・列の表示/非表示を切り替える - Hidden

行・列の表示/非表示を切り替える方法を解説します。

RangeオブジェクトのHiddenプロパティを使用します。

行・列を非表示にする

基本構文

' 行の非表示
Rows(10).Hidden = True
' または
Range("A10").EntireRow.Hidden = True
' 列の非表示
Columns(5).Hidden = True
' または
Range("E10").EntireColumn.Hidden = True

解説

行・列の表示/非表示を設定するには、
RangeオブジェクトのHiddenプロパティを使用します。


Trueを渡すと非表示になり、Falseを渡すと再表示されます。


Rangeオブジェクトと書きましたが、実際はRangeオブジェクトの内、
行全体(Rows)または列全体(Columns)に対してしか実行できません。

単独セルや、矩形のセル範囲から実行した場合は、

実行時エラー '1004':
Range クラスの Hidden プロパティを設定できません。

エラーとなります。


また、同じく行/列全体であったとしても、
エリアが複数にわたる場合も同様のエラーになります。

Rows("1:1,3:3").Hidden = True ' ← これもエラー

Hiddenプロパティは「1エリアからなる行/列全体」に対して実行してください。



行全体・列全体は通常Rows/Columnsプロパティを使用して取得しますが、
サンプルのように「EntireRow/Columnプロパティ」でも取得できます。


EntireRow/Columnプロパティはセルやセル範囲から行/列全体を取得でき、
Hiddenの他にもDeleteやCopyでも活躍します。

便利なプロパティですので覚えておきましょう。

行/列を再表示する

上記の通り、HiddenプロパティにFalseを渡すと行/列を再表示できます。

' 行の再表示
Rows(10).Hidden = False
' または
Range("A10").EntireRow.Hidden = False
' 列の再表示
Columns(5).Hidden = False
' または
Range("E10").EntireColumn.Hidden = False

 
また、Hiddenプロパティは表示されている行を再表示してもエラーになりませんので、
以下のように非表示行を含めた大きな範囲で実行してもOKです。

' 3,7,10行目が非表示になっており、すべての行を再表示したい場合
Rows("2:15").Hidden = False

 

すべての行/列を再表示する

すべての行/列を再表示するには以下のコードを実行します。

Worksheets("○○").UsedRange.EntireRow.Hidden = False
Worksheets("○○").UsedRange.EntireColumn.Hidden = False

 
WorksheetオブジェクトのUsedRangeプロパティを使用すると、
現在使用しているセル範囲全体を取得できます。

あとはこのUsedRangeのEntireRow/Columnに対して、
Hidden = False を実行すればOKです。


なお、この「全行/列の再表示」は以下のコードでも実行可能です。

Worksheets("○○").Cells.EntireRow.Hidden = False
Worksheets("○○").Cells.EntireColumn.Hidden = False

UsedRangeがCellsに変わっていますので、
文字通り1,048,576行を再表示しているコードです。


最新のExcelはこの手の「すべてのセルへの処理」をした際に、
処理が遅くなりすぎないようUsedRangeだけを処理してくれることが多いです。

Hiddenもこのコードで問題なく実行はできます。


ただ、Excelのバージョンによっては極端に遅くなる可能性もあり、
Clearなど最新のExcelでも全セルに処理が走って激重になるメソッドもあります。

とりあえずUsedRangeを使っておけば安心なのは間違いないですので、
UsedRangeの使用をおすすめします。
 

行・列の表示状態を調べる

Hiddenプロパティはプロパティですので当然読み取ることも可能です。

Hiddenプロパティを読み取って、
「表示されている行だけを処理」するコードがこちらです。

Sub 表示されている行のみを処理する()
    
    Dim 処理シート As Worksheet
    Set 処理シート = Worksheets("○○")
    
    Dim 最終行 As Long
    最終行 = 処理シート.UsedRange.Rows.Count + 処理シート.UsedRange.Row - 1
    
    Dim R As Long
    For R = 2 To 最終行
    
        If 処理シート.Rows(R).Hidden = False Then
        
            ' ここに表示されている行への処理を書く
        
        End If
    
    Next
    
End Sub

表示/非表示状態を調べたい場合は、
上記のようにHiddenプロパティを調べてください。


なお、Hiddenプロパティは設定時と同様に、
読取も単独セルやセル範囲からは行えず、

実行時エラー '1004':
Range クラスの Hidden プロパティを取得できません。

エラーとなります。

表示/非表示の状態は行全体/列全体から取得してください。


また、表示行と非表示行が混じった場合のHiddenプロパティも、
上記と同じエラー
が発生します。


このような混在状態はNullが返ることが多いのですが、
Hiddenプロパティは何も返さずエラーとなりますのでご注意ください。
 

行/列の表示をトグル切り替えする

マクロのボタンなどで行/列の表示をON/OFF切り替えしたい場合は、
以下のようなコードを用いてください。

例えば「3,7,8,10列目の表示ON/OFFを切り替える」コードがこちらです。

Sub 列の表示を切り替える()
    
    Dim 処理シート As Worksheet
    Set 処理シート = Worksheets("○○")
    
    If 処理シート.Columns(3).Hidden = True Then
        処理シート.Columns(3).Hidden = False
        処理シート.Columns(7).Hidden = False
        処理シート.Columns(8).Hidden = False
        処理シート.Columns(10).Hidden = False
    Else
        処理シート.Columns(3).Hidden = True
        処理シート.Columns(7).Hidden = True
        処理シート.Columns(8).Hidden = True
        処理シート.Columns(10).Hidden = True
    End If

End Sub

前述の通り表示/非表示が混在するとエラーになるため、
判定は先頭の1列でだけ行うのが安全です。


ただし上記のコードは3,7,8,10を二回指定しておりメンテナンス性が悪いので、
実際はフラグ変数を使用して以下のようにまとめることをおすすめします。

Sub 列の表示を切り替える()
    
    Dim 処理シート As Worksheet
    Set 処理シート = Worksheets("○○")
    
    Dim 現在の表示 As Boolean
    現在の表示 = 処理シート.Columns(3).Hidden

    処理シート.Columns(3).Hidden = Not 現在の表示
    処理シート.Columns(7).Hidden = Not 現在の表示
    処理シート.Columns(8).Hidden = Not 現在の表示
    処理シート.Columns(10).Hidden = Not 現在の表示

End Sub