この記事では「エクセルにてフィルタを横向き(横方向:関数やVBA)の処理方法【行方向:マクロも】」について解説していきます。
残念ながら、エクセルの標準機能として「横方向のフィルタ」はサポートされていません。
そのため、下記により処理を実現する必要があります。
・行と列を入れ替えたもう一つの表を作成
・グループ化
・VBAマクロ
それでは、サンプルデータを用いて解説しましょう。
エクセルにてフィルタを横向き(横方向:関数やVBA)の処理方法【行方向:マクロも】
下記サンプルはある年度の各々の商品における出荷個数を示した表です。
行と列を入れ替え、「月」でフィルタをかけられるようにする想定です。
初めに白紙のシートを用意しておきます。
「商品名」列を選択状態にして右クリック、コンテキストメニューより「コピー」を選択します。
白紙のシートを選択し、コンテキストメニューより「形式を選択して貼り付け」を選択します。
開いたダイアログで貼り付けを「すべて」または「罫線を除くすべて」に設定し、「行/列の入れ替え」にチェックを入れます。
OKを押し、商品名が横方向に張り付けられれば成功です。
同様の処理を「月」行でも行い、表のタイトルを完成させましょう。
ここまでできたら、セルB2に「=OFFSET(‘S3’!$B$2, COLUMN()-2, ROW()-2)」 と入力します。
なお、セル参照を行っているので、”(ダブルクォーテーション)で括らないように注意しましょう。
使用している関数について解説します。
OFFSET関数は、指定したセルから○行△列に位置するセルの値を取得する際に使用し、
と入力します。
各引数には
・参照(‘S3’!$B$2): シート「S3」のセルB2 *事前に参照元のシート名を確認しておく
・行数(COLUMN()-2): B列に相当
・列数(ROW()-2): 2行目に相当
・[高さ] (-): 今回は未使用
・[幅] (-): 今回は未使用
をそれぞれ指定します。
COLUMN関数は、列番号を取得する際に使用し、
と入力します。
ROW関数は、行番号を取得する際に使用し、
と入力します。
今回はセルB2に書き出す想定なのでCOLUMN()-2、ROW()-2といった使い方となります。
ENTERを押すと、結果が出力されます。
オートフィル機能を使用するとすべてのセルに数式を素早くコピーすることができます。
最後に、参照元の値の変更が、新たに作成した表に反映されることを確認しておきましょう。
エクセルにてフィルタを横向き(横方向:関数やVBA)の処理方法2【行方向:マクロも】
今度はグループ化を設定してみましょう。
下記サンプルにおいて、4月~3月を選択した状態でリボンより「データ」–「アウトライン」–「グループ化」–「グループ化」をクリックします。
「グループ化」ダイアログで列を選択します。
OKを押すと、1つめのグループが設定されます。
同様に4月~2月、4月~1月、…4月~5月とグループ化を設定していきます。
これにより過去の月を1つずつ非常時にするといったことが可能になります。
VBA(マクロ)にてフィルタを横向きの処理方法
少し敷居は高いですが、VBAマクロでの実現方法についてお話しします。
最初に表示設定を行う領域を用意する必要があります。
今回はセルO3:Z3に設定された内容でフィルタ処理を行う想定でお話しします。
セルO3:Z3を選択した状態でリボンより「データ」–「データの入力規則」をクリックします。
「データの入力規則」ダイアログで下記の通り設定します。
・元の値: ○
*上記以外のデフォルトで設定されている箇所は変更不要
このように、セルにドロップダウンメニューが表示されればOKです。
表示させる月に「○」を入力します。
本例では「4月, 8月, 10月」としてみました。
次にVBEを起動させます。
キーボードでAlt+11と押してみましょう。
下記のようなウィンドウが開いたら成功です。
左端に表示されているツリーを右クリックし、「挿入」–「標準モジュール」をクリックします。
白紙のテキストエディタが開くのでここにコードを実装します。
なお、下記では「Option Explicit」と書かれていますが、これはエクセルの設定によりデフォルトで書かれる場合があります。
直接動作に影響を与えるものではないので、無視して構いません。
記述するコードは下記の通りです。
'関数名、シートにおいて、この名前で表示される
Sub Work()
'ループで使用するセルオブジェクト
Dim rng As Range
'ループ変数
Dim i As Integer
'ループ処理 処理範囲はセルO3:Z3
For Each rng In Range("O3:Z3")
'「○」が入っていれば表示 そうでなければ非表示
If rng.Value = "○" Then
Columns(i + 2).Hidden = False
Else
Columns(i + 2).Hidden = True
End If
'ループ変数のインクリメント
i = i + 1
Next
End If
なお、’(シングルクォーテーション)の後ろに書いているのはコメントで、コードに対する覚書として書かれるのが一般的です。
書かなくても動作への影響はありませんが、後々のメンテナンス及び引継ぎの際には必要となることがほとんどなので、書いておくことをお勧めします。
今回は、当コード内における解説を記載してありますので、しっかり確認しましょう。
ここまでできたらVBEを閉じ、シートに戻ります。
Alt+F8と押し、下記ダイアログに作成したマクロ「Work」を選択して、実行をクリックします。
実行すると表示設定で指定した月のみが表示されます。
まとめ エクセルにてフィルタを横方向にかける方法【行方向:横向き:マクロ(VBA)も】
この記事では「エクセルにてフィルタを横方向にかける方法【行方向:横向き:マクロ(VBA)も】」について解説しました。
将来は横方向のフィルタが標準機能としてサポートされる可能性もありますが、それまではこのような手法で凌ぐよりないでしょう。
一見何も策がないように見えても、簡単に諦めてはなりません。
知恵を絞れば必ず道が開けるはずです。
コメント