条件に合う行以外は非表示にする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

VBA解説
  1. 「前日」というマクロを実行する
  2. セルB2の値はセルB2の値から1を引いた値にする
  3. セルA3~AQ23の範囲でフィルター機能を使ってデータを抽出し、検索条件はセルC1~C2とする
  4. 検索条件に一致する行を全て表示する
  5. マクロ記録終了

これにより、前日ボタンを押すと日付が前日に変わり、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

VBA解説
  1. 「全員」というマクロを実行する
  2. 現在表示中のシートでフィルターがかかって非表示になっている行も含めて全て表示する
  3. マクロ記録終了
タイムシフト全員
ShowAllDataで元通り全員表示します

この機能を使いこなせたからこそ、タイムシフト表を作ることができましたので、皆様もぜひ挑戦してみてくださいね。

ちょっと長いですけど、タイムシフトの作り方を書いてあります。