
VBAフィルター機能を使って条件に合わない行は自動的に非表示にする方法

タイムシフト表や成績表などで、条件を満たす人だけを表示して、そうでない人は非表示にするというフィルター機能を使って見やすくしたいと思った事ありませんか?
その為には、条件に合わない人(行自体)を非表示にしてしまうフィルター機能をVBAで使えば解決しますよ。
AdvancedFilterメソッド
フィルター機能と言えば、ワークシート上のリボンツールバー➡データ➡フィルターで抽出条件を使って必要なデータを表示することができます。
言い換えれば、不要なデータの行を非表示にするという事ですね。
この作業をワークシート上で行うと、先ほど書いた通り最低でも3回はクリックが必要で、抽出条件を選んだ分だけ更にクリックする回数が増えてしまいます。
これを1回のクリックで、条件に合う行以外を非表示にするAdvancedFilterメソッドを使う事に何倍も作業が早くなります。

上の図はタイムシフト表で、ご覧の通り一部の行が非表示になっていますが、これは出勤予定のないスタッフは自動的に非表示になるようにVBAコードを書いているからです。
出勤時間で抽出条件にする
C列には出勤時間が個人の出勤予定表からDGET関数を使って入力されるようになっています。
その為に休み予定のスタッフは当然出勤時間が無いので空欄になっています。
そこで出勤時間を抽出条件にして、フィルター機能をVBAで書いたのが下記です。
Sub 前日()
Range(“B2”) = Range(“B2”) – 1
Range(“A3:AQ23”).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange _
:=Range(“C1:C2”), Unique:=False
End Sub
- 「前日」というマクロを実行する
- セルB2の値はセルB2の値から1を引いた値にする
- セルA3~AQ23の範囲でフィルター機能を使ってデータを抽出し、検索条件はセルC1~C2とする
- 検索条件に一致する行を全て表示する
- マクロ記録終了
これにより、前日ボタンを押すと日付が前日に変わり、DGET関数で取得された出勤時間がある行だけを表示することができます。
そして抽出条件の範囲がデータ見出しとスタッフの人数分の20名分合わせた(3列目から23列目)21列分となっています。
では、もう少し細かく見て行きましょう。
AdvancedFilterの範囲と引数
Range(“A3:AQ23”).AdvancedFilterで、セルA3~AQ23の範囲で抽出元の範囲として、それ以下が引数となります。
Action
抽出したデータの表示場所をしていし、データ元の範囲内で不要なデータを非表示にして必要データのみ表示するか、別の指定した場所にコピーして表示することを選ぶことができ、必ず指定する必要があります。
xlFilterInPlace | 抽出元と同じ範囲内で条件に合わない行を非表示にして表示する |
xlFilterCopy | 抽出元と別の指定した場所にデータをコピーします |
CriteriaRange
ワークシート上に用意した抽出条件を指定しますので、ここではセルC1の出勤、セルC2の>7:00を範囲指定して、7時よりも後に出勤時間が表示されている場合となっています。
Unique
抽出したデータに重複データが含まれている場合に、抽出するかしないかを選べるようになっています。
ここでは、同じ時間に出勤するスタッフがいるので、重複データも抽出してくれないとシフト表として成り立たないので、重複データも抽出するに設定しています。
False | 重複データを抽出表示する |
Ture | 重複データは抽出しない |
これで、条件に合う行以外は非表示にするVBAフィルター機能を、ボタン1回押すだけであっという間に完成できました。
ShowAllDataメソッド
VBAを活用してフィルター機能で条件に合わない行を非表示にできたのならば、今度は元に戻すことができなくてはいけません。
その方法はShowAllDataメソッドを使う事で、フィルターがかけられている範囲に対して全ての行を表示する指示を出してくれます。
Sub 全員()
ActiveSheet.ShowAllData
End Sub
- 「全員」というマクロを実行する
- 現在表示中のシートでフィルターがかかって非表示になっている行も含めて全て表示する
- マクロ記録終了

この機能を使いこなせたからこそ、タイムシフト表を作ることができましたので、皆様もぜひ挑戦してみてくださいね。
ちょっと長いですけど、タイムシフトの作り方を書いてあります。
