VBAで非表示の行や列を見つける方法と確認のコツ
非表示の行や列を探すには
最初に、どのような目的で「非表示」を探すのかをはっきりさせます。たとえば「印刷前に隠れている行を確認したい」「共有前に意図せず隠した列を戻したい」「非表示の場所だけ色を付けたい」「一覧で記録したい」などです。目的がはっきりすると、使う方法(手作業、VBAで選択、VBAで一覧出力)が決まります。
Excel では、行や列を右クリックで「非表示」にできます。VBAでは、その状態を Hidden プロパティで判定できます。ただし、オートフィルターで見えなくなっている行は、Hidden=True にはなりません。この違いを最初に知っておくと、迷いにくくなります。
この記事では、やさしいステップで次の流れを紹介します。
- 非表示の考え方と見つけ方の選択肢
- Hidden プロパティの基本
- 非表示の「行」を探す実用コード
- 非表示の「列」を探す実用コード
- 一括で再表示する方法(安全策つき)
すぐに使える最短コードも各章のはじめに置きます。慣れてきたら「一覧出力」版に進めば、記録や確認がしやすくなります。
最短で確認する一番かんたんな方法は?
・少数の行や列なら、シート左の行見出し・上の列見出しをドラッグして範囲選択し、右クリック→再表示が早いです。
・VBAで一気に確認したいときは、この記事の「非表示の行を探す方法」「非表示の列を探す方法」の最短スニペットを使います。
非表示を判定する基本:Hiddenプロパティ
Hidden(ヒドゥン)プロパティは、「その行(列)が手動で非表示かどうか」を返します。True なら非表示、False なら表示です。ここではよく使うメンバーを短く整理します。
- Rows(i).Hidden / Columns(j).Hidden
- 個々の行・列の表示状態を返します。
- Range(“A1”).EntireRow.Hidden / EntireColumn.Hidden
- そのセルを含む行・列の表示状態を返します。
- Selection.EntireRow.Hidden など
- 選択範囲の先頭セルを含む行・列の状態を見ます。
注意したいのは「見えない=常に Hidden=True ではない」ことです。オートフィルターで絞り込んでいると、画面に表示されない行があっても Hidden は False のままです。フィルターで見えない行を調べたい場合は、SpecialCells(xlCellTypeVisible) など別の考え方を使います。
よくある混同を表でまとめます。
| 見えない理由 | Hidden の値 | 主な見分け方 | 代表的な対処 |
|---|---|---|---|
| 手動の非表示(右クリック→非表示) | True | 行/列の太さが 0 に変更 | Hidden=False に戻す |
| オートフィルターで非表示 | False | フィルターの状態を確認 | フィルター解除、または可視セルのみ操作 |
| アウトライン(グループ化)で折りたたみ | True(折りたたみ時) | アウトラインの+/-ボタン | グループ展開、またはHidden=False |
Hidden を使って調べたいのは、主に「手動で隠した」「グループ化で折りたたんだ」ケースです。フィルター絡みは別枠で考えます。
AutoFilterで見えない行はHidden=Trueになる?
・いいえ。フィルターで絞って見えなくなっても、Hidden は通常 False のままです。Hidden=True は「手動非表示やグループ折りたたみ」のときです。
非表示の行を探す方法
ここでは、シートの中から Hidden=True の「行」だけを探し、選択・色付け・一覧出力するテンプレを紹介します。まずは最短コードから。
最短スニペット(非表示の行を選択)
“`vba
Sub SelectHiddenRows()
Dim r As Range, hit As Range
For Each r In ActiveSheet.UsedRange.Rows
If r.EntireRow.Hidden Then
If hit Is Nothing Then
Set hit = r
Else
Set hit = Union(hit, r)
End If
End If
Next
If Not hit Is Nothing Then hit.Select
End Sub
“`
・上のコードは、アクティブシートの UsedRange(実データがある範囲)だけを走査します。全シートより速いことが多いです。
・見つかった行を Union でまとめて、最後に一度で選択します。画面がちらつきにくくなります。
色付けして確認する(見落とし防止)
“`vba
Sub MarkHiddenRows()
Dim r As Range
Application.ScreenUpdating = False
For Each r In ActiveSheet.UsedRange.Rows
If r.EntireRow.Hidden Then r.Interior.Color = RGB(255, 230, 150)
Next
Application.ScreenUpdating = True
End Sub
“`
・ScreenUpdating を切ると、処理中の描画負荷が下がります。最後に True に戻すのを忘れないようにします。
一覧を別シートに出力する(行番号と簡単メモ)
“`vba
Sub ListHiddenRows()
Dim ws As Worksheet, logWs As Worksheet
Dim r As Range, n As Long
Set ws = ActiveSheet
Set logWs = ThisWorkbook.Worksheets.Add
logWs.Name = “HiddenRows_” & ws.Name
logWs.Range(“A1”).Value = “Row”
logWs.Range(“B1”).Value = “Address”
n = 2
For Each r In ws.UsedRange.Rows
If r.EntireRow.Hidden Then
logWs.Cells(n, 1).Value = r.Row
logWs.Cells(n, 2).Value = r.Address(0, 0)
n = n + 1
End If
Next
logWs.Columns.AutoFit
End Sub
“`
・出力用に新しいシートを作り、行番号とアドレスを並べます。共有前の確認ログとして便利です。
大きいシートで速くするヒント
- 走査範囲を UsedRange から、さらに必要な行範囲に絞ります(例:1〜5000 行だけ)。
- 処理の前後で Application.ScreenUpdating / Calculation / EnableEvents を切り替えます(後述のテンプレ参照)。
- 隠れている数が多いと Union の結合コストが上がるため、選択ではなく「色付け」や「一覧出力」を使うと安定することがあります。
パフォーマンステンプレ(行にも列にも使える)
“`vba
‘ 高速化スコープのテンプレ
Private Type AppState
calc As XlCalculation
scr As Boolean
evt As Boolean
End Type
Private Sub WithFast(ByVal run As String)
Dim s As AppState
s.calc = Application.Calculation
s.scr = Application.ScreenUpdating
s.evt = Application.EnableEvents
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Run run
Application.Calculation = s.calc
Application.ScreenUpdating = s.scr
Application.EnableEvents = s.evt
End Sub
“`
・使い方:Call WithFast(“MarkHiddenRows”) のように、実処理を別プロシージャに分けて呼び出します。終了時に必ず元の設定へ戻すのがポイントです。
大きいシートでも時間を短くするには?
・範囲をしぼる、画面更新を止める、書き込み回数を減らす、の3点が基本です。選択やセルごとの操作を減らし、まとめて処理すると速くなります。
非表示の列を探す方法
考え方は「行」と同じです。Hidden=True の「列」だけを集め、選択・色付け・一覧出力します。まずは最短コードから。
最短スニペット(非表示の列を選択)
“`vba
Sub SelectHiddenCols()
Dim c As Range, hit As Range
For Each c In ActiveSheet.UsedRange.Columns
If c.EntireColumn.Hidden Then
If hit Is Nothing Then
Set hit = c
Else
Set hit = Union(hit, c)
End If
End If
Next
If Not hit Is Nothing Then hit.Select
End Sub
“`
見出し行を使ってレポート化する(列名つき)
“`vba
Sub ListHiddenCols()
Dim ws As Worksheet, logWs As Worksheet
Dim c As Range, n As Long
Set ws = ActiveSheet
Set logWs = ThisWorkbook.Worksheets.Add
logWs.Name = “HiddenCols_” & ws.Name
logWs.Range(“A1”).Value = “Col”
logWs.Range(“B1”).Value = “Header”
logWs.Range(“C1”).Value = “Address”
n = 2
For Each c In ws.UsedRange.Columns
If c.EntireColumn.Hidden Then
logWs.Cells(n, 1).Value = c.Column
logWs.Cells(n, 2).Value = ws.Cells(1, c.Column).Value
logWs.Cells(n, 3).Value = c.Address(0, 0)
n = n + 1
End If
Next
logWs.Columns.AutoFit
End Sub
“`
・先頭行(1行目)に項目名が入っている前提の例です。見出しを一緒に出力すると、共有時に理解しやすくなります。
特定範囲だけ(例:A:Z)を対象にする
“`vba
Sub SelectHiddenCols_AtoZ()
Dim c As Range, hit As Range
For Each c In ActiveSheet.Range(“A:Z”).Columns
If c.EntireColumn.Hidden Then
If hit Is Nothing Then
Set hit = c
Else
Set hit = Union(hit, c)
End If
End If
Next
If Not hit Is Nothing Then hit.Select
End Sub
“`
・UsedRange ではなく、明示した列だけを調べます。範囲が小さいほど速く終わります。
特定範囲だけ(例:1〜100行)を対象にする
・列の探索であっても、チェックしたい行の高さを限定すると、処理後の確認がしやすくなります。色付けやコメントを使うと、差し戻し時の説明が簡単です。
特定範囲だけを対象にできる?
・できます。Range(“A:Z”) や Range(“B:D”) のように、列範囲を明示します。UsedRange で足りないときは、対象の列だけに変えてください。
非表示の行・列を一括で再表示する
まとめて再表示する場合は、事前に「どこが非表示だったか」をメモしておくと安全です。誤って全部を表示に戻したあとでも、元の状態に近づけやすくなります。まずは最短コードです。
最短スニペット(行と列をすべて表示)
“`vba
Sub UnhideAll()
With ActiveSheet
.Rows.Hidden = False
.Columns.Hidden = False
End With
End Sub
“`
とても強力です。すべての非表示が解除されます。作業前にバックアップやログの作成をおすすめします。
バックアップつきの再表示(ログを残す)
“`vba
Sub UnhideAllWithLog()
Dim ws As Worksheet, logWs As Worksheet
Dim r As Range, c As Range, n As Long
Set ws = ActiveSheet
Set logWs = ThisWorkbook.Worksheets.Add
logWs.Name = “UnhideLog_” & ws.Name
logWs.Range(“A1”).Value = “Type”
logWs.Range(“B1”).Value = “Index”
logWs.Range(“C1”).Value = “Address”
n = 2
‘ 行のログ
For Each r In ws.UsedRange.Rows
If r.EntireRow.Hidden Then
logWs.Cells(n, 1).Value = “Row”
logWs.Cells(n, 2).Value = r.Row
logWs.Cells(n, 3).Value = r.Address(0, 0)
n = n + 1
End If
Next
‘ 列のログ
For Each c In ws.UsedRange.Columns
If c.EntireColumn.Hidden Then
logWs.Cells(n, 1).Value = “Col”
logWs.Cells(n, 2).Value = c.Column
logWs.Cells(n, 3).Value = c.Address(0, 0)
n = n + 1
End If
Next
‘ 解除
ws.Rows.Hidden = False
ws.Columns.Hidden = False
logWs.Columns.AutoFit
End Sub
“`
・まず非表示の行・列をログに残し、その後まとめて解除します。あとから「どこを戻したか」を説明できます。
行だけ/列だけを安全に戻すコツは?
・解除対象を Rows.Hidden または Columns.Hidden のどちらかだけにします。心配なときは、先にログを残してから解除します。Ctrl+Z(元に戻す)が効くケースもありますが、複雑なマクロ処理のあとだと戻せないことがあります。
付録:フィルター可視性とHiddenの違いを使い分ける
非表示の判定でよくあるつまずきは「フィルターで見えない行」を Hidden=True と誤解してしまうことです。ここでは、2つの軸で考えると整理できます。
- 表示状態(見える/見えない)
- 非表示の理由(手動/グループ/フィルター)
次の例は、可視セルだけを色付けするコードです。Hidden とは別の視点になります。
“`vba
Sub HighlightVisibleOnly()
Dim r As Range
On Error Resume Next
Set r = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not r Is Nothing Then r.Interior.Color = RGB(204, 255, 204)
End Sub
“`
・フィルターで絞ったあとに使うと、見えているセルだけに色が付きます。Hidden=True の検出とは目的が異なります。