Excel FILTER関数×ドロップダウン連動の使い方|VBAで入力規則を自動切り替え!

Excel FILTER関数×ドロップダウン連動の使い方|VBAで入力規則を自動切り替え!

Excelの「FILTER関数」は、条件に合ったデータだけを瞬時に抽出できる便利な関数です。
一覧から特定の条件に絞って表示したり、フォームに応じた選択肢を動的に切り替えたりと、活用の幅が広がっています。

しかし、そんなFILTER関数にも1つ弱点があります。
それは、「抽出結果をそのままプルダウン(入力規則)に使えない」という点です。

たとえば「都道府県を選ぶと、市区町村のリストが自動で切り替わる」といった連動入力をFILTER関数で実現したくても、通常の設定ではうまくいきません。

そこで本記事では、FILTER関数とVBA(マクロ)を組み合わせて、連動ドロップダウンを自動的に切り替える方法をわかりやすく解説します。

✔ FILTER関数でリストを抽出
✔ VBAでそのリストを読み取り、入力規則に適用

という流れで、**より柔軟な連動フォームの構築が可能になります。

条件に応じた動的プルダウンを実現したい方や、FILTER関数をもっと実務で活用したい方は、ぜひ参考にしてみてください!
プルダウン(入力規則)の設定方法については以下の記事にてご確認いただけます。
Excelプルダウンのコピー・複数選択・削除・色分けの方法まとめ|連動や空白対応も解説!

Excel連動プルダウンの活用事例まとめ|申請書・発注書で役立つ入力効率アップ術!

目次

FILTER関数×ドロップダウンってどんな場面で使える?

FILTER関数とドロップダウン(プルダウン)を組み合わせると、「入力する人に合わせて、選択肢を自動で切り替える」という仕組みが作れます。
これは、日常の業務でよくある”連動入力”のニーズにぴったりです。


 代表的な活用シーン

■ アンケートやフォーム入力

  • 「都道府県を選んだら、市区町村の一覧が切り替わる」

  • 「職種を選んだら、対応する部署だけを選択肢に表示」

■ 発注・見積書作成

  • 「カテゴリを選ぶと、該当する商品のみ選べる」

  • 「商品名を選んだら、対応する品番や単価が自動で設定される」

■ 顧客管理やマスタ参照

  • 「顧客ランクを選んだら、そのランクの割引率一覧だけ表示」

  • 「エリアを選んで、該当する担当者だけを一覧に」

なぜFILTER関数が便利なのか?

これまでのExcelでは、こうした「条件によって選択肢を変える」仕組みは、INDIRECT関数+名前の定義 などで実現されてきました。
しかしこの方法は、項目が増えると管理が煩雑になり、拡張性に限界がありました。

FILTER関数なら、次のようなシンプルな構文で動的なリスト抽出が可能です:

=FILTER(市区町村一覧[市区町村], 市区町村一覧[都道府県]=A2, "該当なし")

これにより、一覧の更新や拡張にも強く、柔軟性の高い連動リストを構築できるようになります。

この章では主に「どんな場面で使えるか?」を紹介しましたが、
次章では、FILTER関数の基本構文や注意点について、実例を交えて解説していきます。

FILTER関数の基本と制限をおさらい

FILTER関数は、指定した条件に一致するデータだけを抜き出して表示する関数です。
動的に絞り込みができるため、ドロップダウンやマスタ連動のベース作りに非常に便利です。


FILTER関数の基本構文

=FILTER(範囲, 条件, [一致しない場合の表示])

例:

=FILTER(B2:B100, A2:A100=E2, "該当なし")

この式では、

  • A2:A100 の中から、E2 に一致する行を探し

  • その行に対応する B2:B100 の値だけを抽出

  • 該当がなければ「該当なし」と表示されます

→ 実際には「都道府県」ごとの「市区町村」抽出などに使われます。

市町村抽出の例:

  1. あらかじめ市町村データを作成しておきます。
    入力シートとは別のシートに作成しておいた方が間違って編集してしまうリスクを避けられます。
    あらかじめ市町村データを作成
  2. フィルター関数を入力します。
    今回はテーブル機能を利用しているため、以下の関数を入力しました。

=FILTER(市区町村一覧[市区町村], 市区町村一覧[都道府県]=A2, "該当なし")

フィルター関数を入力

テーブル名:市町村一覧データから北海道の市町村を抽出し表示させることができました。

FILTER関数の主なメリット

  • リアルタイムで動的にリストが変わる

  • 1つの関数で複数条件に対応できる

  • 従来のVLOOKUPやIFよりも柔軟な構成が可能


⚠ FILTER関数の注意点とよくある制限

入力規則には直接使えない

FILTERの出力結果(スピル範囲)は見た目はリストですが、
「データの入力規則(プルダウン)」では直接参照できないという制限があります。

やりたいこと 結果
=FILTER(…) を「元の値」に設定 ❌ エラーになる
スピルされた範囲を入力規則に使いたい VBAなどで再設定が必要

 複数範囲・複数条件の書き方に注意

  • AND条件:(条件1)*(条件2) のように掛け算で書く
    図の例では兵庫県かつ神戸市を抽出しています。
    AND条件:(条件1)*(条件2) のように掛け算で書く

  • OR条件:(条件1)+(条件2) のように足し算で書く
    図の例では東京都または大阪府の市町村を抽出しています。
    OR条件:(条件1)+(条件2) のように足し算で書く

 別シートの参照は「入力規則」と組み合わせる際に制限がある

  • 表示用には問題ないが、入力規則や定義と組み合わせる際は制限あり

  • FILTER → 表示、VBA → 入力規則 に役割分担すると安定


 補足:FILTER関数は「表示」としては非常に優秀

たとえば、「都道府県を選んだら、該当する市区町村がF列にずらっと出てくる」という形なら、FILTERだけで十分です。
ただし、「そのリストを選択肢として使いたい(=ドロップダウン化したい)」となると、VBAの力が必要になります。


次章ではいよいよ、FILTERの抽出結果をVBAで読み取り、プルダウンの入力規則に反映する仕組みを解説していきます。

FILTER関数の結果をそのままプルダウンに使えない理由

FILTER関数は非常に強力で、条件に合うデータを即座にリスト化できます。
しかし、多くの方が最初につまずくのが「そのリストをそのままプルダウンの選択肢として使えない」という点です。


 なぜ使えないのか?

Excelの「データの入力規則(リスト)」では、セル範囲の参照しかできず、関数そのものを使うことができません。

たとえば、以下のような構文は入力規則の「元の値」に直接入力しても動作しません

=FILTER(市区町村一覧[市区町村], 市区町村一覧[都道府県]=A2)

これを入力規則に使おうとすると、次のようなエラーになります:

「この数式には問題があります」
→ 入力規則ではFILTERのようなスピル関数は非対応
入力規則ではFILTERのようなスピル関数は非対応


技術的な理由

  • スピル関数の出力は「動的配列」であり、見た目は範囲に見えても、
     入力規則の「元の値」で参照できるのは静的なセル範囲
    のみ

  • =D2# のようにスピル参照を間接的に指定しても、入力規則では使えないという制限があります


解決方法:VBAの力を借りて制御する

ここで登場するのが VBA(マクロ) です。

FILTER関数で生成したリストを、VBAで読み取り、入力規則のリストとして再設定することで、この制限を回避できます。

次章では実際に、都道府県の選択によって市区町村のプルダウンを切り替えるVBAコードのサンプルを使って、その仕組みを解説していきます。


 POINT:FILTERは「見せる」には最適、でも「選ばせる(入力規則)」には工夫が必要!

FILTER×VBAで動的にプルダウンを制御する方法

FILTER関数で抽出されたリストは、入力規則に直接使えないことは前章でお伝えしました。
そのため、FILTERの結果をVBAで読み取り、該当セルにプルダウンを設定し直すという手順で解決します。


サンプル構成と仕組みの流れ

以下のような構成で動作します:

セル 内容
A2 都道府県の選択(東京、大阪など)
D2:D10 FILTER関数で市区町村を抽出して表示
B2 市区町村を選択するドロップダウン(VBAで動的に設定)

処理の流れ:

  1. ユーザーがA2セルで都道府県を選ぶ

  2. D列に対応する市区町村一覧がFILTER関数で表示される

  3. VBAがD列の表示範囲を読み取り、B2セルの入力規則に設定


✅ VBAコード例(Worksheet_Changeイベント)

以下のVBAコードを、対象のシートのコードモジュールに貼り付けます:

Private Sub Worksheet_Change(ByVal Target As Range)
  ' 都道府県が入力されたときのみ処理
  If Target.Address = "$A$2" Then
    Dim ws As Worksheet
    Set ws = Me ' このコードが貼られているシートを対象

    ' FILTER結果が表示される列(例:D列)
    Dim startCell As Range
    Set startCell = ws.Range("D2")

    ' FILTER結果の最終行を取得(空白まで)
    Dim lastCell As Range
    Set lastCell = startCell.End(xlDown)

    ' スピル範囲の終了地点を確認
    If IsEmpty(lastCell.Value) Then
      Set lastCell = startCell
    End If

  ' プルダウン設定対象(B2)の入力規則を更新
    With ws.Range("B2").Validation
      .Delete ' 既存の入力規則を削除
      .Add Type:=xlValidateList, _
      AlertStyle:=xlValidAlertStop, _
      Formula1:="=$D$2:$D$" & lastCell.Row
      .IgnoreBlank = True
      .InCellDropdown = True
    End With
  End If
End Sub

VBAコード例(Worksheet_Changeイベント)


コードの補足ポイント

処理内容 説明
Worksheet_Change A2セルの変更時に自動発動
.End(xlDown) D列のスピル範囲の終わりを探す
.Validation.Add 入力規則をB2セルに設定(FILTER結果を範囲として使用)

 VBA設定の準備手順

  1. Alt + F11 でVBAエディターを開く

  2. 対象のシート(例:「フォーム」)をダブルクリック

  3. 上記コードを貼り付けて保存

  4. Excelに戻ってA2セルを操作して動作を確認


 FILTER数式の例(D列に設定)

=FILTER(市区町村一覧[市区町村], 市区町村一覧[都道府県]=A2, "該当なし")

図の例ではD2セルに上記の関数を設定しています。

FILTER数式の例(D列に設定)

またはシンプルな例:

=FILTER(B2:B100, A2:A100=A2, "該当なし")

次章では、FILTER+VBAを使った連動制御の応用ポイントや注意点について詳しく解説していきます。

FILTER+VBA連携の応用ポイントと注意点

FILTER関数とVBAを組み合わせれば、従来のINDIRECTや名前定義よりも柔軟性の高い連動プルダウンを実現できます。
しかし、実務で活用するにはいくつかのポイントと注意点を押さえておく必要があります。


✅ 応用ポイント①:複数行に展開して使う

商品明細やアンケートのように、複数行で同じ仕組みを使いたい場合は、以下のように工夫します。

  • 各行の都道府県セル(例:A2:A10)に対して

  • 対応するFILTER結果を別列に出力(例:D列〜)

  • VBAで行ごとにスピル範囲を参照し、隣のセルに入力規則を設定

▼ 改良例(複数行対応VBAの構想)

If Not Intersect(Target, Range("A2:A10")) Is Nothing Then
' 変更された行番号に応じて、動的に入力規則を変更する処理
End If

✅ 応用ポイント②:別シートのFILTER結果を対象にする

FILTER結果が「別シート」にある場合、VBAでは以下のようにフルパス指定で処理すれば対応できます。

Set startCell = ThisWorkbook.Sheets("データ").Range("D2")

ただし、入力規則の元の値に別シートのセル範囲は直接指定できないため、VBAで一時的にコピー or 中継セルに転記する必要があります。


✅ 応用ポイント③:複数条件によるFILTER抽出

たとえば「都道府県」と「カテゴリ」のように、複数の条件で抽出リストを制御したい場合は、以下のように書けます:

=FILTER(商品一覧[商品名], (商品一覧[都道府県]=A2)*(商品一覧[カテゴリ]=B2)

→ AND条件(両方に一致)で動的リストを抽出できます。


⚠ 注意点①:入力規則の上書きに注意

  • VBAの実行で入力規則が都度上書きされるため、
     フォーム入力後に再選択が必要になるケースがある

  • 対策として「1回限り設定」や「編集保護」を導入することも検討


⚠ 注意点②:VBAが無効な環境では動作しない

  • VBAを使っているため、マクロ無効モードでは動作しない

  • 対策:環境制限がある場合は「FILTER+転記+簡易選択」で対応する別パターンを用意


FILTER関数は「見せる力」に優れ、VBAは「制御する力」に優れています。
この2つを組み合わせることで、自由度の高い実務向けの連動プルダウンが構築できるようになります。

FILTER関数×VBAで柔軟な連動リストを作成しよう!

ExcelのFILTER関数は、条件に応じたデータ抽出を瞬時に行える、非常に強力なツールです。
しかし、FILTER関数だけではそのまま入力規則に反映させることができないという弱点があります。

そこで本記事では、FILTER関数とVBA(マクロ)を組み合わせることで、
条件に応じて、ドロップダウンの選択肢を自動で切り替える仕組み」を実現する方法を解説しました。


本記事で紹介したポイントをおさらい

  • FILTER関数の基本構文と使い方

  • 入力規則ではFILTERの出力が使えない理由

  • VBAでFILTER結果を取得してドロップダウンに反映する方法

  • 複数行・複数条件・別シート対応の応用テクニック


 こんな方に特におすすめの方法です

  • Excelフォームの入力効率を上げたい方

  • フィルタされた内容に応じて選択肢を切り替えたい方

  • INDIRECTでは管理しきれなくなってきた中〜上級ユーザー


FILTER関数とVBAを組み合わせれば、
従来の「名前の定義+INDIRECT」では難しかった柔軟な連動プルダウンもスムーズに構築できます。

実際の業務フォームや申請シート、アンケート、見積作成など、さまざまな場面で活用できるテクニックですので、ぜひ試してみてください!

【関連記事】