Excelには便利なオートフィルター機能がついてるが、これって縦方向しかイメージがない。
今回、横方向でフィルターしたいことがあったので、調べてみた。
とりあえず、知らないだけで実はそのような機能があるのかと思い、「エクセル 横 フィルター」でググる。
...
......
なかった。
エクセルには、横方向にフィルターする機能はない。
ではどうするのか。
サンプルを使ってみていく。
サンプルは、先生が担当できる科目を一覧にしたもの。
このように横に長く伸びている場合、どの科目に対して、どの先生が担当できるのか、横スクロールしていかないとわからない。
★このサンプルから、科目5を担当できる先生が誰か、フィルターして探してみる★
案①
行列を入れ替えてフィルターする。
エクセルには行列を入れ替える機能がある。(表をコピー → 形式を選択して貼り付け → 行列を入れ替える)
この機能と縦方向のフィルター機能を使って実現する。
行列を入れ替えるとこんな感じ。
科目5でフィルター。
担当先生が判明した。
だが、この方法は表をコピーして別の表を作成する手間がある。
一回限りならまだしも、何回も探すとなると、面倒くさすぎる。
案②
ExcelVBAを使う。
VBAでマクロを作る。
実現イメージは、
1.科目一覧でフィルターした状態の行番号を保存
2.その行番号の担当先生列を、右に一つずつ見ていき、
○が一つもない場合は、非表示にする
○が一つでもある場合は、表示にする
科目5でフィルターして、
横フィルターボタンをクリック。
担当先生が判明した。
だが、この方法では、速度が遅くなる可能性がある。(今回のサンプルでは早いが)
実現イメージの、以下の部分。
>2.その行番号の担当先生列を、右に一つずつ見ていき、
> ○が一つもない場合は、非表示にする
> ○が一つでもある場合は、表示にする
このときに、一つずつ設定していくと、速度が遅くなることがあった。
非表示の設定を行うときは、一括で設定したほうがよさそうである。
案③
ExcelVBA + SUBTOTAL関数を使う。
SUBTOTAL関数を埋め込み、それを用いてVBAでマクロを作る。
実現イメージは、
1.各担当先生列の○の個数を関数で取得する
2.その個数が
0のセルをすべて取得する
0以外のセルをすべて取得する
3. 取得した0セルを一括で非表示にする
取得した0以外セルを一括で表示にする
図は、案②と一緒なので、違うところだけ。
先頭行にSUBTOTAL関数を使用する。(別に先頭じゃなくてもいい)
案②との違いは、
・一括で設定するので速度が速いはず
・表の行を追加する場合は、VBAの修正が不要
たが、この方法では、関数が漏れたり式が壊れると誤動作する恐れがある。
(最終的にVBAで関数を埋め込めば、式が崩れる心配もなく、手間もなくなり、一石二鳥)
また、終端列に値が設定されていない場合、
一度横フィルターボタンを押してフィルターされた状態から、解除のボタンを押すと、フィルターされた位置までしか解除されない!
これを回避するためには、終端列の隣に、何か値を設定しておく必要がある。
ここら辺は、もうちょっと工夫したらよいのかもしれない。
こちらの記事も参考にしてください。