
Excel VBA 検索窓にキーワードを入力しEnterキーで検索するフォームの作り方 | Intersect
仕事でVBAを使うことがあり、やりたいことはネットで調べていますが、VBA初心者の私が分かりづらかったものを、初心者でも分かるように説明したいと思います。
効率的なコードが書けていない可能性もありますので、予めご了承ください。
今回はEnterキーをトリガーとしてオートフィルターを起動し、羅列された情報の中からキーワードで検索するフォームの作り方を紹介します。
使用ケース
以下のような、情報を蓄積している一覧のエクセル、社内とかでよくありますよね。
このままでも毎回検索など行い、使えないことはないですが、利便性が悪いのでマクロを使用しもっと使いやすくしてみます。

完成イメージ
上記のエクセルに手を加えて、以下の仕様にします。
- セルB2に検索窓を設置。
- 検索窓にキーワードを入力しEnterを押すと、検索したキーワードが含まれる内容だけが表示される。
- リセットボタンを押すとセルB2のキーワード、フィルタがリセットされる。

下準備
マクロの前に、下準備としてエクセルの表に少し手を加えます。
- セルB2に検索窓を設置(B2でなくてもOK)。
- 項目名・内容どちらのワードでも検索できるように、各行のD列に、B列(項目名)とC列(内容)をまとめる数式を入力。具体的には、D5であれば「=B5&C5」と入力し、最終行まで入力します。

サンプルコード
Sub フィルター()
Range("A4:D4").AutoFilter Field:=4, Criteria1:="*" & Range("B2").Value & "*"
ActiveWindow.ScrollRow = 1
Range("B2").Select
End Sub
Sub フィルター解除()
Range("B2").ClearContents
ActiveSheet.ShowAllData
ActiveWindow.ScrollRow = 1
End Sub
マクロを該当シートのみの適用とするため、シートモジュールにもマクロを書いていきます。

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B2")) Is Nothing Then
Else
Application.Run "フィルター"
End If
End Sub
コード解説(標準モジュール)
まずは標準モジュールから解説していきますね。
Range("A4:D4").AutoFilter Field:=4, Criteria1:="*" & Range("B2").Value & "*"
AutoFilterメソッドで、 下準備で行ったD列から、検索窓に入力された文字(Range("B2").Value)を検索しています。
*(アスタリスク)で囲むことで、ワイルドカードで検索させるようにします。
Range(セル範囲).AutoFilter Field:=絞り込む列番号, Criteria1:=絞り込む文字列
ActiveWindow.ScrollRow = 1
オートフィルタでの検索結果が複数行に渡る場合、一番下の行が表示され、上部が隠れてしまいます。
検索が完了したら、一番上の行が表示されるように、ActiveWindow.ScrollRowで1を設定します。
ここまでがフィルター設定の部分となり、続いてはフィルター解除部分です。
Range("B2").ClearContents
ActiveSheet.ShowAllData
ActiveWindow.ScrollRow = 1
解除部分は簡単なので、まとめて解説してしまいます。
①検索窓(B2)をクリア
②ActiveSheet.ShowAllDataでフィルタ全解除
③一番上の行を表示
という流れです。
コード解説(シートモジュール)
続いてシートモジュールの解説です。
Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Changeイベントを使うことで、コードを記載したシートのセルが変更されたときに処理を実行することができます。
If Intersect(Target, Range("B2")) Is Nothing Then
Else
Intersect(範囲1, 範囲2)
Intersectメソッドは、複数のセル範囲の重なっている部分のセル範囲を取得するApplicationのメソッドですが、前述のWorksheet.Changeイベントと組み合わせることによって、指定したセルに変更があった場合に処理を実行することができます。
今回のコードを訳すと、「B2のセル値が変更された場合に処理を実行」になります。
これによって検索窓に文字を入力しEnterを押すと、セルの値がブランクから〇〇に変更することによって、マクロが実行されるという仕組みです。
Application.Run "フィルター"
別のプロシージャーのマクロを実行するために「Application.Run」を使用し、"フィルター"マクロを実行します。
以上、Enterキーでマクロを実行する検索フォームの作り方でした。
本格的な検索フォームを作ろうとするとデータベース化などが必要なのかもしれませんが、今あるものの利便性を簡単に上げるという手段として、選択するのもいいのかなと思います。

ユーザーフォームで入力内容確認画面の作り方

ユーザーフォームを使用した入力フォームの作り方

週ごとに縦に並んだ表を横並びにする方法 | Find&Set

セルに入力された日付を取得し自動でシートとファイルを作る方法

検索窓にキーワードを入力しEnterキーで検索するフォームの作り方 | Intersect

ブックを開いた時のウィンドウサイズを指定する方法 | workbook_open

新規ブックを作成しマクロが登録されたボタンを設置する方法 | OnAction

複数のワークシートをまとめて表示・非表示にする方法 | Visible Not.Visible

セル位置が変わっても特定の範囲を選択する方法 | Find&Address

電話番号からハイフンを削除し0から表示させる方法 | Evaluate&Replace

ダイアログボックスからファイルを選択して開く | GetOpenFilename