【エクセルVBA】セル入力した瞬間にフィルタ・絞り込み

当ページのリンクには広告が含まれています。

スポンサーリンク

VBAを使って、

セルに入力した「文字列」「数値」で、シート上の表の フィルタ(絞込み)を行う方法を紹介します。

下の動画を見るとイメージできるかと思います。

クリックしてジャンプ

イメージ動画(音声はありません)

この フィルタ処理 を行う際には、2カ所にプログラムを書く必要があります。

動画では「Sheet1」と「Module1」という2カ所に処理(VBAコード)を書いています。

サンプルダウンロード

説明に使用しているエクセルファイルです

下図のような表示が出た場合は、以下の手順でマクロを有効にできます

  1. 一度、エクセルを閉じる
  2. ダウンロードしたエクセルファイルを「右クリック」
  3. 「プロパティ」を選択
  4. 「全般」タブのセキュリティの「許可する」に
  5. 「適用」ボタンをクリック
  6. 「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)を「数値 + 文字付」としてフィルターをかけています

文字列」をフィルタする処理

動画では、指定列以外は「文字列」としてフィルターをかけるようにしています。

入力したテキストが消された時の処理

その列のフィルターを解除する

スポンサーリンク

クリックしてジャンプ