Excelで大量のデータを確認していると、「完了したデータだけ一時的に見えなくしたい」「対象外のデータを隠して、必要な行だけ確認したい」という場面があります。
不要な行であれば削除する方法もありますが、後から内容を確認する可能性があるデータまで削除してしまうのは危険です。
このような場合は、Excel VBAでセルの値を判定し、条件に一致した行だけを自動的に非表示にする方法が利用できます。
行そのものを削除するわけではないため、必要になったときには再表示できます。特に、処理済みデータを一時的に画面から除外したい場合や、確認対象を絞り込みたい場合に便利です。
この記事では、Hiddenプロパティを使って条件に一致する行を非表示にする基本から、実務で扱いやすいコードの組み立て方まで解説します。
✅ VBAで条件に一致する行を非表示にする仕組み
条件に一致する行を隠す処理は単純に見えますが、実務では「削除」と「非表示」を混同しないことが重要です。行を削除すると、その行に保存されていたデータそのものがなくなります。
一方、非表示はデータを残した状態で画面上から見えなくする処理です。この違いを理解せずに削除処理へ置き換えると、後から確認が必要になったときに元へ戻せない可能性があります。また、VBAで行を非表示にするときは、判定するセルと実際に隠す行を正しく対応させる必要があります。まずは、条件判定から行を非表示にするまでの基本的な流れを整理しておきましょう。
・値を判定して行全体を非表示にする流れ
今回の処理は、大きく次のような流れになります。
- 処理対象となるワークシートを指定する
- 条件判定に使用する列を決める
- データが入力されている最終行を取得する
- 2行目から最終行まで順番に値を確認する
- 指定した条件に一致するか判定する
- 条件に一致した行全体を非表示にする
- 最終行まで同じ処理を繰り返す
たとえば次のようなデータがあるとします。
| 管理番号 | ステータス | 担当者 |
|---|---|---|
| 1001 | 完了 | 田中 |
| 1002 | 処理中 | 佐藤 |
| 1003 | 完了 | 鈴木 |
| 1004 | 未処理 | 高橋 |
この表でB列の「ステータス」が「完了」になっている行だけを非表示にすると、管理番号1001と1003の行が画面上から隠れます。
一方、「処理中」「未処理」の行はそのまま表示されます。
ここで重要なのは、B列だけを非表示にするのではなく、B列の値を条件として該当する行全体を非表示にすることです。
条件判定に使うセルと、実際の処理対象を分けて考えるとコードを理解しやすくなります。
・行の削除ではなく非表示を選ぶメリット
条件に一致するデータを画面から除外するだけなら、行を削除する必要はありません。
非表示にしておけば、元データはシート上に残ります。
たとえば「完了した案件は通常の確認画面では見せたくないものの、問い合わせがあった場合には過去データを確認したい」という業務があります。
このようなケースでは、
完了 → 非表示
処理中 → 表示
という運用ができます。
削除してしまうと過去データそのものが失われますが、非表示なら再表示することで確認できます。
ただし、非表示にしたデータもExcel内部には存在しています。
「見えていないから処理対象にならない」とは限らないため、別のVBA処理や関数、集計などと組み合わせる場合には注意が必要です。
条件に一致したデータを一時的に隠すのではなく、不要な行そのものを取り除きたい場合は、「特定の値を含む行を削除する方法」で、条件判定から複数行を安全に削除する方法まで解説しています。
✅ VBAで条件に一致した行をHiddenプロパティで非表示にする
VBAで行を非表示にするときに使用できるのがHiddenプロパティです。しかし、Hidden = Trueだけを覚えてしまうと、どの範囲に対して設定するのか分からなくなりやすい点に注意が必要です。今回の目的はセルを隠すことではなく、条件に一致したデータが存在する「行全体」を非表示にすることです。
また、SelectやActivateを使って対象行を選択してから処理する必要もありません。実務用コードでは対象となるワークシートと行を直接指定した方が、処理対象を判断しやすくなります。ここでは、後から判定条件を変更しやすい形で基本コードを作成します。
・「完了」の行だけを非表示にする実務向けコード
例として、「データ」シートのB列を確認し、値が「完了」の行を非表示にします。
Sub HideCompletedRows()
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim currentRow As Long
'処理対象のシートを設定
Set wsTarget = ThisWorkbook.Worksheets("データ")
'ステータスが入力されているB列から最終行を取得
lastRow = wsTarget.Cells(wsTarget.Rows.Count, "B").End(xlUp).Row
'見出しを除き、2行目から最終行まで確認
For currentRow = 2 To lastRow
'ステータスが「完了」の行を非表示にする
If wsTarget.Cells(currentRow, "B").Value = "完了" Then
wsTarget.Rows(currentRow).Hidden = True
End If
Next currentRow
End Sub
このコードでは、B列のセルを1行ずつ確認しています。
条件に一致した場合に、
wsTarget.Rows(currentRow).Hidden = True
を実行し、その行全体を非表示にします。
currentRowには現在確認している行番号が入るため、B5が「完了」であれば5行目、B10が「完了」であれば10行目が非表示になります。
また、対象シートをwsTargetへ設定しているため、ユーザーが画面上で別のワークシートを選択していたとしても、「データ」シートを処理対象として明示できます。
SelectやActivateを挟まずに直接処理できるので、どのシートに対する操作なのかもコードから判断しやすくなります。
・RowsとEntireRowはどちらを使えばよいか
行全体を非表示にするコードでは、次のような書き方を目にすることがあります。
wsTarget.Rows(currentRow).Hidden = True
一方、セルを基準として、
wsTarget.Cells(currentRow, "B").EntireRow.Hidden = True
と書くこともできます。
今回のようにcurrentRowで行番号を管理しているのであれば、Rows(currentRow)を使用すると「現在の行を非表示にしている」ことが分かりやすくなります。
一方、検索によって取得したセルや特定のRangeオブジェクトを基準に処理する場合は、EntireRow.Hiddenの方が自然なこともあります。
どちらか一方しか使ってはいけないわけではありません。
重要なのは、現在のコードがセルを基準にしているのか、行番号を基準にしているのかに合わせて読みやすい方法を選ぶことです。
実務では、短いコードにすることよりも、後から見たときに処理対象が分かることを優先した方が修正しやすくなります。
✅ VBAで行を非表示にする前に既存の非表示状態を考える
条件に一致する行を非表示にできても、マクロを何度も実行する業務では「すでに隠れている行をどう扱うか」という問題が出てきます。
たとえば前回は「完了」だったデータが、修正によって「処理中」に戻ることもあります。その状態で非表示にする処理だけを再実行しても、以前隠した行は自動では表示されません。つまり、現在の値と画面上の表示状態が一致しなくなる可能性があります。この問題はコードのエラーとして表示されないため、利用者が「対象データが消えた」と勘違いする原因にもなります。定期的に実行するマクロでは、非表示にする処理だけでなく、再表示をどのタイミングで行うのかも設計しておく必要があります。
・HiddenをFalseにすると行を再表示できる
非表示にするときは、
.Hidden = True
を使用しました。
反対に、
.Hidden = False
とすると対象行を表示できます。
たとえばデータ部分を一度すべて表示してから、現在の条件に基づいて改めて非表示にする方法があります。
考え方としては、
- データ行をいったん再表示する
- 現在のステータスを確認する
- 「完了」の行だけ再び非表示にする
という流れです。
この方法なら、以前「完了」だった行が「処理中」へ変更された場合でも、次回実行時に表示状態を現在のデータへ合わせられます。
ただし、利用者が手動で隠している行まで存在するシートでは、すべてを再表示すると意図的な非表示状態まで解除してしまう可能性があります。
そのため実務では、VBAが管理する非表示なのか、利用者が手動で設定する非表示なのかも考えて処理範囲を決めることが大切です。
✅ VBAで条件に応じて行の表示・非表示を自動で切り替える
定期的に実行するマクロでは、「条件に一致した行を隠す」だけでは表示状態が古いまま残ることがあります。前回実行時には「完了」だったデータが、その後の修正で「処理中」に変更されるケースがあるためです。このときHidden = Trueだけを実行するコードでは、一度非表示になった行はそのまま残ります。データ上では処理中なのに画面では見えない、という不一致が起きると確認漏れにつながります。
毎回現在の値に合わせて表示状態を更新したいのであれば、非表示だけでなく再表示まで同じ判定処理に含める方法があります。どちらの設計にするかは、マクロを一度だけ実行するのか、繰り返し利用するのかを考えて決めましょう。
・If文でHiddenのTrueとFalseを切り替える
現在の値に応じて表示状態を更新するなら、If文のElseを利用できます。
Sub UpdateRowVisibility()
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim currentRow As Long
'処理対象のシートを設定
Set wsTarget = ThisWorkbook.Worksheets("データ")
'ステータス列の最終行を取得
lastRow = wsTarget.Cells(wsTarget.Rows.Count, "B").End(xlUp).Row
'見出しを除き、データ行を順番に確認
For currentRow = 2 To lastRow
If wsTarget.Cells(currentRow, "B").Value = "完了" Then
'完了したデータは非表示
wsTarget.Rows(currentRow).Hidden = True
Else
'完了以外のデータは表示
wsTarget.Rows(currentRow).Hidden = False
End If
Next currentRow
End Sub
このコードでは、B列が「完了」の場合だけHidden = Trueにします。
それ以外は、
wsTarget.Rows(currentRow).Hidden = False
として再表示します。
この方法のメリットは、マクロを実行するたびに現在のステータスと行の表示状態を一致させられることです。
たとえば、
「処理中」→「完了」
へ変更されれば次回実行時に非表示になります。
反対に、
「完了」→「処理中」
へ戻された場合には再表示されます。
一度すべての行を再表示してから条件判定をやり直す方法もありますが、このコードなら各行の条件判定と表示状態の更新を同じ場所で確認できます。
ただし、前半でも触れたように、利用者が手動で非表示にした行がある場合には注意が必要です。
Else側でHidden = Falseにすると、条件に一致しない行はVBAによって表示されます。
そのため、手動の非表示状態を維持する必要があるシートでは、この方法をそのまま使用しないなど、運用ルールに合わせた設計が必要です。
✅ VBAで複数条件に一致する行を非表示にする
実際のデータでは、1つの値だけで表示・非表示を決められないケースもあります。「完了かつ確認済みだけを隠す」「完了または対象外なら隠す」など、複数項目を組み合わせて判定することもあります。このような処理でも、行を非表示にする部分そのものは変わりません。変更するのは、Hiddenを実行する前の条件判定です。
条件が増えたときに非表示処理まで複雑に書き換えると、後から仕様を変更しにくくなります。「どの行を対象にするか」と「対象行をどう処理するか」を分けて考えることが、保守しやすいコードにつながります。
・AND条件で複数の値を判定して行を隠す
たとえば、
- B列のステータスが「完了」
- C列の確認状態が「確認済み」
という2つの条件を両方満たした行だけを非表示にする場合は、Andを使用できます。
If wsTarget.Cells(currentRow, "B").Value = "完了" And _
wsTarget.Cells(currentRow, "C").Value = "確認済み" Then
wsTarget.Rows(currentRow).Hidden = True
End If
この場合、「完了」だけでは非表示になりません。
C列も「確認済み」になって初めて対象になります。
一方、「完了」または「対象外」のどちらかなら隠す、といった条件ではOrを利用できます。
If wsTarget.Cells(currentRow, "B").Value = "完了" Or _
wsTarget.Cells(currentRow, "B").Value = "対象外" Then
wsTarget.Rows(currentRow).Hidden = True
End If
実務では条件が増えるほど、If文の中身が読みにくくなりやすくなります。
複雑な条件を扱う場合でも、
条件を判定する処理 → 対象行を非表示にする処理
という役割を意識すると、仕様変更にも対応しやすくなります。
2つ以上の条件を組み合わせる処理を詳しく確認したい場合は、「複数条件に一致する行を抽出する方法」で、AND・OR条件の違いと条件判定の組み立て方を解説しています。
・部分一致で特定の文字を含む行を非表示にする
完全一致ではなく、「完了」という文字を含んでいれば対象にしたいケースもあります。
たとえば、
- 完了
- 処理完了
- 確認完了
をまとめて判定したい場合です。
このようなケースではInStrを利用できます。
If InStr(1, wsTarget.Cells(currentRow, "B").Value, "完了", vbTextCompare) > 0 Then
wsTarget.Rows(currentRow).Hidden = True
End If
これにより、対象セルの文字列内に「完了」が含まれていれば行を非表示にできます。
ただし、部分一致は意図していないデータまで対象になる可能性があります。
たとえば業務上「未完了」という値が存在していれば、そこにも「完了」という文字が含まれています。
その場合、「完了」を含むという理由だけで「未完了」まで非表示になる可能性があります。
したがって、完全一致で判定できるデータなら無理に部分一致を使用せず、実際に保存されている値のルールに合わせて判定方法を選ぶことが重要です。
「完了」の完全一致ではなく、セル内に特定の文字が含まれているかを判定したい場合は、「特定の文字を含む行を抽出する方法」で、InStrを使った部分一致検索の考え方も確認できます。
✅ VBAで行を非表示にするときはフィルターとの違いも理解する
条件に合わない行を画面から見えなくするだけなら、「VBAで1行ずつHiddenを設定する必要はないのでは?」と考えることもできます。Excelにはオートフィルターがあり、条件に応じて表示するデータを絞り込めるためです。大量の一覧データでは、フィルターを利用した方が目的に合う場合もあります。
一方、特定の業務ルールに従って複数箇所の表示状態を制御したい場合などは、VBAからHiddenを設定する方が扱いやすいことがあります。どちらか一方を常に使うのではなく、データの構造や利用者の操作方法に応じて選ぶことが大切です。
・Hiddenが向いている処理とフィルターが向いている処理
Hiddenを利用する方法は、行そのものの表示状態を直接変更します。
たとえば、
- 特定のステータスになった行を自動的に隠す
- マクロの一連の処理として行の表示状態を変更する
- 複数の業務条件を判定して対象行を制御する
といったケースで利用できます。
一方、一覧表から「完了以外だけを表示したい」など、表形式のデータを条件で絞り込むことが主目的なら、オートフィルターも有力な選択肢です。
特に大量の行を1行ずつループしてHiddenへ設定する処理は、データ件数が増えるほど処理時間が長くなる可能性があります。
そのため、
VBAで行を隠せるから必ずHiddenを使う
のではなく、
業務上、本当に行のHidden状態を変更する必要があるのか
を考えることも重要です。
✅ VBAで大量の行を非表示にするときの実務上の注意点
数十行程度のデータでは問題なく動くコードでも、数万行を扱うと処理速度が気になる場合があります。特に各行を順番に確認しながら表示・非表示を切り替える処理は、対象件数が増えるほど繰り返し回数も増えます。処理速度だけを理由に複雑なコードへ変更すると保守性が落ちることもありますが、毎日扱う大量データなら設計を見直す価値があります。
また、非表示になった行もデータとしては残っているため、後続のマクロがすべての行を処理するのか、表示されている行だけを対象にするのかにも注意が必要です。非表示処理だけで完結させず、その後に実行される処理まで考えておくとトラブルを防ぎやすくなります。
・非表示にした行もデータから削除されたわけではない
Hidden = Trueにした行は、見えなくなっただけです。
セルの値は残っているため、通常のセル参照であれば非表示行も対象になることがあります。
たとえば別のVBAコードで、
For currentRow = 2 To lastRow
として全行を処理しているなら、行が非表示であるかどうかに関係なくループの対象になります。
「隠したから後続処理からも除外される」と考えると、想定外の集計や転記につながる可能性があります。
非表示行を後続処理から除外したいのであれば、表示状態を確認するなど、別の判定が必要です。
また、大量データを扱う場合には、すべての処理をセル単位で繰り返すより、配列を利用して条件判定を高速化する方法も考えられます。
ただし、最終的にExcelの行そのものを非表示にする場合はシートに対する操作が必要になるため、単純に配列へ置き換えればすべて高速になるわけではありません。
まずは処理対象の件数や実行頻度を確認し、必要以上にコードを複雑にしないことも実務では大切です。
条件に一致した行を非表示にするのではなく、別シートへ残して元データと分けて管理したい場合は、「条件に一致する行を別シートへコピーする方法」も参考にしてください。
✅ まとめ:VBAで条件に一致する行を安全に非表示にしよう
VBAで条件に一致する行を非表示にするときは、Hidden = Trueを設定するだけでなく、データをどのように運用するのかまで考えることが重要です。特に繰り返し実行するマクロでは、以前隠した行をいつ再表示するのかを決めておかないと、現在のデータと表示状態が一致しなくなることがあります。
また、削除と非表示は目的が異なり、非表示にした行のデータはシート上に残り続けます。複数条件や部分一致にも対応できますが、条件を広げすぎると意図しない行まで対象になるため注意が必要です。大量データではオートフィルターなど別の方法も候補になります。単に行を隠すだけではなく、再表示や後続処理まで含めて設計することで、実務でも扱いやすいマクロになります。
Rows(行番号).Hidden = Trueで対象行を非表示にできるHidden = Falseを設定すると非表示になった行を再表示できる- 繰り返し実行する場合は現在の条件と表示状態を一致させる
AndやOrを使えば複数条件による判定もできるInStrを使えば特定の文字を含む行を判定できる- 部分一致では「未完了」など意図しない文字列まで一致しないか確認する
- 非表示にした行のデータ自体は削除されない
- 表形式の大量データではオートフィルターが適している場合もある
- 後続のVBA処理では非表示行も対象になる可能性がある
条件に一致する行を自動で非表示にできるようになると、完了データを一時的に隠したり、確認が必要なデータだけを画面上に残したりと、一覧表を扱いやすくできます。
一方で、不要なデータそのものを取り除きたい場合は「削除」、別の場所へまとめたい場合は「抽出・コピー」、元データを保持したまま見えなくしたい場合は「非表示」というように、目的によって処理を使い分けることが大切です。
業務で繰り返し利用する場合は、非表示にする処理だけで終わらせず、「どの条件なら再表示するか」「非表示行を後続処理でどう扱うか」まで決めておくと、安全で保守しやすいVBA処理にできます。