次の DEMO を見にいく
Excel

VBAで非表示の行や列を見つける方法と確認のコツ

k.w
\お買い物マラソン開催中/
スポンサーリンク

非表示の行や列を探すには

最初に、どのような目的で「非表示」を探すのかをはっきりさせます。たとえば「印刷前に隠れている行を確認したい」「共有前に意図せず隠した列を戻したい」「非表示の場所だけ色を付けたい」「一覧で記録したい」などです。目的がはっきりすると、使う方法(手作業、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 の検出とは目的が異なります。

スポンサーリンク
記事URLをコピーしました