
法律事務所では、相談受け付け時の利益相反の確認が重要ですよね。

そうなんです。エクセルで作った過去の相談者のリストを検索するのですが、「すべて検索」機能を使っても、検索結果が見づらいです。

「オートフィルタ」機能というのもありますよ。

それも使ってみました。でも、列ごとではなく全体を検索したいですよね。小さな「▼ボタン」をクリックするのも面倒です。

分かりました。法律事務所で使いやすい検索機能を持ったエクセル用アドインを作ってみましょう。
サンプルのダウンロード
インストール方法
操作マニュアル
仕様
1. プロジェクト概要
Excelのリスト(テーブルまたは通常の範囲)に対して、高度な「あいまい検索」を行い、条件に合致しない行を非表示にする(フィルタリングする)VBAツール。
標準のオートフィルタでは難しい、異体字、全半角、日付形式、かな遣いの揺らぎを吸収した柔軟な検索を可能とする。
2. ファイル構成
プロジェクトは以下のモジュールで構成すること。
| モジュール名 | 種類 | 役割 |
| Settings | 標準モジュール | 検索の挙動(あいまいレベル)を制御する定数定義 |
| SearchLogic | クラスモジュール | 文字列の正規化、日付判定、検索判定を行うコアロジック |
| SearchAddin_Main | 標準モジュール | フォーム呼び出し、シート保護解除、行の表示/非表示実行 |
| SearchForm | ユーザーフォーム | 検索語句入力、AND/OR指定、実行・クリアボタンを持つUI |
| ThisWorkbook | ThisWorkbook | 更新履歴の保持およびブックのエントリポイント |
3. モジュール詳細仕様
(1) Settings(標準モジュール)
検索の「あいまいさ」を決定する Public Const のBoolean定数を定義する。デフォルトは全て True とする。
- 定数リスト:
ENABLE_IGNORE_VARIANT_CHAR: 異体字(斉⇔斎、沢⇔澤など)を同一視する。ENABLE_IGNORE_WIDTH_CASE: 全角/半角、大文字/小文字を同一視する。ENABLE_SMART_DATE_SEARCH: 日付形式(2025/1/1 ⇔ R7.1.1)を同一視する。ENABLE_IGNORE_DAKUTEN: 濁点・半濁点の有無(は⇔ば⇔ぱ)を同一視する。ENABLE_IGNORE_SMALL_KANA: 拗音・促音などの小書き文字(つ⇔っ、や⇔ゃ)を同一視する。ENABLE_IGNORE_CHOON: 長音符(ー)の有無を同一視する。ENABLE_IGNORE_KANA_TYPE: ひらがな/カタカナを同一視する。
(2) SearchLogic(クラスモジュール)
メソッド: ApplySearchAndHide(rngData As Range, strText As String, strMode As String) As Long
- 機能: 指定されたデータ範囲を走査し、条件に合致しない行を特定して非表示用Rangeオブジェクトを作成する。
- 引数:
rngData: 検索対象のデータ本体範囲(ヘッダーを除く)。strText: 検索キーワード(スペース区切りで複数指定可能)。strMode: “AND” または “OR”。
- 戻り値: ヒットした件数。
- 処理ロジック:
- キーワードをスペース(全角・半角)で分割する。
- データ範囲を配列に取り込み、高速化を図る。
- 各セルおよび検索キーワードに対して、後述の
NormalizeString関数を通して正規化を行う。 Settingsの設定に従い、日付マッチングや文字列部分一致判定を行う。- 行ごとにAND/OR判定を行い、ヒットしなかった行を
Unionメソッドで結合して記憶する。 - 最後に、記憶した「非表示にする行」を一括で
EntireRow.Hidden = Trueにする(パフォーマンス最適化のため)。
関数: NormalizeString(strInput As String) As String
- 機能: 比較用に文字列を正規化する。
- 処理順序(SettingsのフラグがTrueの場合):
- 異体字統一: IVS(異体字セレクタ)の除去、および特定文字の置換(例: 亞→亜, 榮→栄, 廣→広, 櫻→桜, 澤→沢, 髙→高, 﨑→崎 など)。
- カナ・全半角統一:
- 必要に応じてカタカナに統一(
StrConvのvbKatakana)。 - 全角を半角に統一(
StrConvのvbNarrow)。 - アルファベットを大文字に統一(
UCase)。
- 必要に応じてカタカナに統一(
- 濁点除去: 半角濁点・半濁点記号を除去。
- 小書き文字統一: 半角の「ッ」「ャ」などを大文字の「ツ」「ヤ」等に置換。
- 長音除去: 半角ハイフン、半角長音、全角長音(ー)を除去。
(3) SearchAddin_Main(標準モジュール)
プロシージャ: ShowSearchForm
- アクティブセルがデータ範囲内(テーブルまたはCurrentRegion)にあるかチェックする。
- シートが保護されている場合、一時的に解除を試みる(パスワードなし前提)。
- 対象範囲が空、または不適切な場合は警告を出す。
- フォームをモードレスで表示する。
プロシージャ: ShowSearchFormFromRibbon(control As Object)
- リボンUIからのコールバック用ラッパー。
ShowSearchFormを呼び出す。
プロシージャ: ExecuteSearch(strText As String, strMode As String)
SearchFormから呼び出される検索実行処理。- 画面描画を停止(
ScreenUpdating = False)。 - シート保護の一時解除。
- 対象範囲(ヘッダー除くデータ部分)の特定(
GetTargetDataBody関数を使用)。 - 既存のフィルタ解除と全行表示を行う。
g_SearchLogic.ApplySearchAndHideを呼び出し、検索実行。- ヒット件数が0の場合はメッセージを表示。
- 処理終了後、シート保護を復元し、描画を再開。
プロシージャ: ClearSearch
- 検索状態を解除し、全てのデータを再表示する。
- 保護解除→全表示→保護復元の流れ。
関数: GetTargetDataBody
- アクティブセルが含まれる
ListObject(テーブル) のDataBodyRangeを返す。 - テーブルでない場合は
CurrentRegionからヘッダー行(1行目)を除いた範囲を返す。
(4) SearchForm(ユーザーフォーム)
- コントロール:
TextBox1: 検索キーワード入力用。OptionButton1: “AND” 検索(キャプション: すべての条件を含む)。OptionButton2: “OR” 検索(キャプション: いずれかの条件を含む)。デフォルトはORとする。CommandButton1: 検索実行。SearchAddin_Main.ExecuteSearchを呼ぶ。CommandButton2: 解除/閉じる。SearchAddin_Main.ClearSearchを呼び、フォームを閉じる(Unload)。
- 動作:
- 実行ボタンクリック時、ラジオボタンの状態を見てモード(AND/OR)を決定し、Mainモジュールの処理へ渡す。
(5) ThisWorkbook
- コメントとしてバージョン履歴、著作権表記(2020-2025 VBA Assets)、VAサーチという名称を含める。
4. 機能要件詳細
- あいまい日付検索:
- 検索語句が日付として解釈可能な場合(例:”2025/1/1″)、セルの値が日付シリアル値であれば、表示形式(西暦、和暦)に関わらず日付としての同一性を判定すること。
- 同時に、文字列として「R7.1.1」のような和暦テキストが含まれている場合もヒットさせること。
- 保護シート対応:
UserInterfaceOnlyではなく、処理の直前にUnprotect、直後にProtectを行う実装とすること(パスワード引数は無し)。
- エラーハンドリング:
- 選択範囲が不適切な場合(データがない等)はメッセージボックスで警告し、処理を中断すること。
- パフォーマンス:
- 行を1行ずつ
Hidden = Trueにするのではなく、非表示対象のRangeをUnionで結合し、最後にまとめて非表示にすること。 - データ配列化により高速化を図ること。
- 行を1行ずつ
5. UIデザイン(フォーム)
- シンプルで使いやすいレイアウト。
- 上段:テキストボックス。
- 中段:検索モード選択(ラジオボタン)。
- 下段:実行ボタン、解除ボタン。


コメント
検索のヒット件数が0の場合は、行を非表示にしないように変更しました。(Ver102)
濁点・半濁点の有無(が⇔か、ぱ⇔は)、小書き文字の有無(っ⇔つ、ゃ⇔や)、長音の有無(ー)、ひらがな/カタカナも同一視してヒットするように変更しました。(Ver110)
OR検索をデフォルトに変更しました。(Ver111)
シートがロックされているされている場合でも動作するようにしました。(Ver112)
リボンからも起動できるように修正しました。(Ver210)