【エクセルVBA】セル入力した瞬間にフィルタ・絞り込み
VBAを使って、
セルに入力した「文字列」「数値」で、シート上の表の フィルタ(絞込み)を行う方法を紹介します。
下の動画を見るとイメージできるかと思います。
イメージ動画(音声はありません)
この フィルタ処理 を行う際には、2カ所にプログラムを書く必要があります。
動画では「Sheet1」と「Module1」という2カ所に処理(VBAコード)を書いています。
サンプルダウンロード
説明に使用しているエクセルファイルです
下図のような表示が出た場合は、以下の手順でマクロを有効にできます。
- 一度、エクセルを閉じる
- ダウンロードしたエクセルファイルを「右クリック」
- 「プロパティ」を選択
- 「全般」タブのセキュリティの「許可する」に ✓
- 「適用」ボタンをクリック
- 「OK」ボタンをクリック
「Sheet1」に記述するコード
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
For Each rng In Target
' 監視範囲を指定
If rng.Row = 2 And rng.Column >= 2 And rng.Column <= 7 Then
Call Filter(rng.Column)
End If
Next rng
End Sub
「module1」に記述するコード
Sub Filter(Col As Integer)
'フィルターをかける表の基準を指定(左上端セル)
With Worksheets("Sheet1").Range("B3")
'日付でフィルタする列
If Col = 7 Then
.AutoFilter Field:=Col - 1, Criteria1:=Format(Cells(2, Col), Cells(4, Col).NumberFormat)
'数値でフィルタする列
ElseIf Col = 2 Or Col = 5 Then
.AutoFilter Field:=Col - 1, Criteria1:=Format(Cells(2, Col), "0")
'数値でフィルタする列
ElseIf Col = 6 Then
.AutoFilter Field:=Col - 1, Criteria1:=Format(Cells(2, Col), "0 cm")
'文字列でフィルタする列
Else
.AutoFilter Field:=Col - 1, Criteria1:="*" & Cells(2, Col) & "*"
End If
End With
If Cells(2, Col).Value = "" Then
If ActiveSheet.FilterMode = True Then
Range("B3").AutoFilter Col - 1
End If
End If
End Sub
説明 – Sheet1
ここでは「Sheet1」の 指定範囲のセル に変更があった事を察知し、「Module1」に書かれた フィルタ処理 を実行することを行っています。
「Worksheet_Change」は VBA に標準搭載されているイベントで、シート上のセルの内容が変更された時に自動的に実行されます。
このイベントは、シート上でセルが変更された場合にトリガーされ、その変化があったセルの「内容」や「変更された範囲」にアクセスすることができます。
今回は「Range:変化したのはこのセルだよ」を 取得しています。
このイベント発生を使って「Module1」に書かれた フィルタ処理 を実行するのですが、そのまま使ってしまうと どこのセルが書換わっても フィルタ処理 が実行されてしまいます。
ひと手間加えて「この範囲のセルが変化した場合だけフィルタ処理実行してね」としています。
2行目(rng.Row = 2)かつ 2列目以上(rng.Column >= 2) かつ 7列目以下(rng.Column <= 7)の 範囲のセルで変化があった時に、Filter(rng.Column) を実行する。
下図の赤枠の範囲が変化したら Filter(rng.Column) を実行する。ということです。
Filter(rng.Column) は「Module1」に 書いてある処理です。
説明 – Module1
ここでは フィルター処理 を書いています。
この列は「日付」でフィルタ、この列は「数値」でフィルタ のように、条件分けをしています。
理由は 書式が違うとフィルター処理できないからです。
「日付」をフィルタする処理
動画では、7列目(Col = 7)を「日付」としてフィルターをかけています
「数値」をフィルタする処理
動画では、2列目(Col = 2)と 5列目(Col = 5)を「数値」としてフィルターをかけています
「数値 + 文字付」をフィルタする処理
動画では、6列目(Col = 6)を「数値 + 文字付」としてフィルターをかけています
「文字列」をフィルタする処理
動画では、指定列以外は「文字列」としてフィルターをかけるようにしています。
入力したテキストが消された時の処理
その列のフィルターを解除する