【エクセルVBA】プルダウンリストから複数の項目を選択する方法

エクセルでプルダウンリストを使っているのに、選択できる項目が1つだけで不便に感じたことはないですか?
「複数の部署を同時に入力したい」「担当者を2人以上選びたいのに、1つしか選べない……」といった場面に直面したことがある方は、きっと多いと思います。
VBAを使えば、
プルダウンリストから複数の項目を選択し、選んだ項目をセルにまとめて自動入力する
ことが可能です。
この記事では、VBAの Validation.Add メソッドと、セル変更イベントで使う引数 Target の基本的な使い方を解説しながら、ドロップダウンリストから複数項目を選択できるマクロを紹介します。
プログラミングが初めての方でも理解できるように、サンプルコードと丁寧な解説を用意しました。
読み終えた頃には、「このコードを自分の業務にすぐ使える!」と感じてもらえるはずです。
プルダウンリストの「1つしか選べない」問題をVBAで解決する
エクセルの入力規則(データの入力規則)を使えば、プルダウンリストは簡単に作れますが、標準機能では選択できる項目は「1つだけ」という制限があります。
たとえば「担当部署」の列に「営業部・総務部・経理部」というリストを用意しても、どれか1つしか選べません。
この問題を解決するのが、今回紹介するVBAです。
セルをクリックしてプルダウンから項目を選ぶたびに、選択した値がセルに追加されていく仕組みを Worksheet_Change イベントと引数 Target を組み合わせて実装します。
一度設定してしまえば、以降は何度クリックしても自動で追記されるので、手作業の無駄がきれいになくなります。
Validation.Add メソッドとは何か
Validation.Add メソッドは、VBAからセルに「入力規則」を設定するためのメソッドです。
エクセルの「データ」タブにある「データの入力規則」をVBAコードで実行するイメージと思ってもらえれば、理解しやすいと思います。
主な引数の意味は以下の通りです。
Type:入力規則の種類(リスト選択の場合は xlValidateList を指定)
AlertStyle:エラーメッセージのスタイル(xlValidAlertStop・xlValidAlertWarning・xlValidAlertInformation)
Formula1:リストの選択肢(カンマ区切りの文字列か、セル範囲を指定)
この Validation.Add を使うことで、「特定のセルに対して、指定したリストからしか入力できないようにする」という制御をVBAから自動で設定できます。
手動で設定するより断然速く、対象セルが大量にあっても一括で適用できるのが大きなメリットです。
引数 Target とは何か
引数 Target は、Worksheet_Change イベントプロシージャで使われる特別な変数です。
Worksheet_Change イベントは「セルの値が変わったとき」に自動的に実行されるプロシージャで、そのとき変更があったセル(またはセル範囲)が Target に自動的に格納されます。
つまり、「どのセルが変更されたか」を Target で判定することで、「プルダウンリストが設定されている列のセルだけに処理を適用する」という条件分岐の設定が可能です。
Target.Column(列番号)や Target.Row(行番号)と組み合わせることで、「B列のセルが変更されたときだけ動く」といった絞り込みが簡単にできます。
この Target の仕組みを理解しておくことが、複数選択マクロのカギになります。
関連記事「引数Targetの使い方」では、Targetの基本的な使い方が詳しく解説されています。
→ → → 「引数Targetの使い方」記事はこちら
なぜ Worksheet_Change イベントを使うのか
複数選択の仕組みを実現するには、「プルダウンで項目を選んだ瞬間」に処理を走らせる必要があります。
ボタンを押して実行するタイプのマクロでは、「選んだ直後に自動で追記する」という動作が実現できません。
Worksheet_Change イベントは、セルの値が変わるたびに自動で実行されます。
プルダウンで項目を選択するとセルの値が変わるため、このイベントが自動的に発火し、「追加する・重複を除く」という処理が即座に走ります。
ユーザーは「選んだら勝手に追記された!」と感じるはずです。
プルダウンリストを設定するVBAコード(Validation.Add)
まず、対象のセル範囲にプルダウンリストを設定するVBAコードを作成します。
ここでは B2:B20 のセル範囲に「営業部・総務部・経理部・開発部・人事部」というリストを設定するサンプルを紹介します。
このコードを一度実行するだけで、対象セルにドロップダウンリストが自動的に設定されます。
Sub プルダウンリスト設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' B2:B20 の範囲に入力規則を設定する
With ws.Range("B2:B20").Validation
.Delete ' 既存の入力規則をリセット
.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="営業部,総務部,経理部,開発部,人事部"
.ShowInput = True ' 入力時にメッセージを表示する
.ShowError = True ' エラー時にメッセージを表示する
End With
MsgBox "プルダウンリストを設定しました。", vbInformation
End Sub
コードの流れを解説します。
With ws.Range(“B2:B20").Validation で、B2からB20の範囲に対して入力規則の設定を開始しています。
.Delete で既存の入力規則を一度リセットしてから、.Add で新しいリストを設定。
Type:=xlValidateList はリスト形式の入力規則を意味し、Formula1 にはカンマ区切りで選択肢を並べます。
AlertStyle:=xlValidAlertStop にすると、リスト以外の値を入力しようとしたときにエラーダイアログが表示される。
このマクロを実行した後、B列のセルをクリックするとドロップダウンリストが表示されるようになります。

セル範囲を変数で管理するとより便利
上のコードでは Range(“B2:B20") とハードコーディングしていますが、データ量が変動する場合は最終行を動的に取得して設定範囲を自動調整することもできます。
Sub プルダウンリスト設定_動的範囲()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A列の最終行を取得してB列の設定範囲を決定
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' B2から最終行までを対象に設定
Dim targetRange As Range
Set targetRange = ws.Range("B2:B" & lastRow)
With targetRange.Validation
.Delete
.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="営業部,総務部,経理部,開発部,人事部"
.ShowInput = True
.ShowError = True
End With
MsgBox "プルダウンリストを設定しました(対象:B2:B" & lastRow & ")。", vbInformation
End Sub
ws.Cells(ws.Rows.Count, 1).End(xlUp).Row でA列の最終行を取得し、B列のプルダウン設定範囲を動的に変更しています。
データ行が増えるたびに手動でコードを修正する手間がなくなるため、実務では上記のコードを採用してください。

リストの選択肢をセル範囲から取得する方法
選択肢が多い場合や、将来的に項目を追加・変更する可能性がある場合は、Formula1 にカンマ区切り文字列を直接書くより、別シートのセル範囲を参照する方法が便利です。
Sub プルダウンリスト設定_セル参照()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' リストシートのA列にリスト項目が並んでいる前提
' (例:リストシートのA1:A5に「営業部〜人事部」)
With ws.Range("B2:B20").Validation
.Delete
.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:="=リスト!$A$1:$A$5" ' 別シートのセル範囲を参照
.ShowInput = True
.ShowError = True
End With
MsgBox "プルダウンリストを設定しました。", vbInformation
End Sub
Formula1 に「=リスト!$A$1:$A$5」のように書くと、「リスト」シートのA1からA5に入力されている値がドロップダウンリストの選択肢になります。
項目を追加・変更したいときはリストシートのA列を編集するだけ。
「部署が増えるたびにVBAを直すのが面倒……」という方には、このセル参照方式が特におすすめです。
複数選択を実現するVBAコード(Worksheet_Change イベント)
次に、プルダウンリストから項目を選ぶたびに「選択した値をセルに追加していく」処理を実装します。
この処理は「シートモジュール」に書く必要があります。
VBAエディター(Alt + F11)を開き、対象シートのシートモジュール(例:Sheet1)をダブルクリックして、以下のコードを貼り付けてください。
Private Sub Worksheet_Change(ByVal Target As Range)
' プルダウンリストが設定されているB列(2列目)のみを対象にする
If Target.Column <> 2 Then Exit Sub
If Target.Row < 2 Then Exit Sub ' 1行目(ヘッダー)は除外
If Target.Count > 1 Then Exit Sub ' 複数セルが同時変更された場合はスキップ
' 選択された値を取得(新しく選んだ値)
Dim newVal As String
newVal = Target.Value
' 空欄の場合は何もしない
If newVal = "" Then Exit Sub
' イベントを一時的に無効化して無限ループを防ぐ
Application.EnableEvents = False
' 既にセルに入力されている値を取得
Dim oldVal As String
oldVal = Target.Value
' セルに既に値があるかチェック
If oldVal = "" Then
' 空欄なら、そのまま選択した値を入力
Target.Value = newVal
Else
' 既に値が入っている場合
' 同じ値をもう一度選んだときは除外する(重複防止)
Dim valArray() As String
valArray = Split(oldVal, ",")
Dim i As Integer
Dim isDuplicate As Boolean
isDuplicate = False
For i = 0 To UBound(valArray)
If Trim(valArray(i)) = Trim(newVal) Then
isDuplicate = True
Exit For
End If
Next i
' 重複していなければ追加する
If Not isDuplicate Then
Target.Value = oldVal & "," & newVal
End If
End If
' イベントを再度有効化する
Application.EnableEvents = True
End Sub
コードの流れを解説します。
まず If Target.Column <> 2 Then Exit Sub でB列以外のセルが変更されたときは処理をスキップしています。
これを入れておかないと、シート上のすべてのセルへの変更でこの処理が動いてしまい、予期しないエラーが発生することがある。
次に Application.EnableEvents = False でイベントを一時停止しています。
セルの値を書き換えると再び Worksheet_Change が発火するため、これを止めないと「無限ループ」が起きてしまいます。
Split(oldVal, “,") で既存の値をカンマ区切りで配列に分割し、For ループで一つひとつ比較して重複チェックをしています。
重複がなければ oldVal & “," & newVal の形でセルに追記し、処理の最後に Application.EnableEvents = True でイベントを再度有効化します。
この一連の流れで「プルダウンで選ぶたびにカンマ区切りで追加される」という動作が完成します。
選択を解除したいときのコード(リセットボタン用)
複数選択した値を全部クリアしたいときのために、「リセット用マクロ」も用意しておくと便利です。
標準モジュールに以下のコードを追加し、ボタンに登録してください。
Sub 選択値リセット()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' アクティブセルがB列の場合のみリセット',
If ActiveCell.Column = 2 And ActiveCell.Row >= 2 Then
ActiveCell.ClearContents
MsgBox "選択内容をリセットしました。", vbInformation
Else
MsgBox "B列のセルを選択してからリセットしてください。", vbExclamation
End If
End Sub
ActiveCell.ClearContents でアクティブセルの値を削除するシンプルなコードです。
「間違えて選んでしまったとき」や「入力し直したいとき」にボタン1クリックでリセットできるため、使い勝手が大きくアップします。
選択した項目を別セルに転記するVBAコード
選択した値をB列に蓄積するだけでなく、「C列に転記する」「別シートに一覧として記録する」という応用もできます。
選択した部署名をB列に表示しつつ、C列に「最後に選んだ項目の数」を自動カウントする例を紹介します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Row < 2 Then Exit Sub
If Target.Count > 1 Then Exit Sub
Dim newVal As String
newVal = Target.Value
If newVal = "" Then Exit Sub
Application.EnableEvents = False
Dim oldVal As String
oldVal = Target.Value
If oldVal <> "" Then
Dim valArray() As String
valArray = Split(oldVal, ",")
Dim i As Integer
Dim isDuplicate As Boolean
isDuplicate = False
For i = 0 To UBound(valArray)
If Trim(valArray(i)) = Trim(newVal) Then
isDuplicate = True
Exit For
End If
Next i
If Not isDuplicate Then
Target.Value = oldVal & "," & newVal
End If
End If
' C列に選択件数を自動入力',
Dim ws As Worksheet
Set ws = Me ' このシートを参照
Dim currentVal As String
currentVal = ws.Cells(Target.Row, 2).Value
If currentVal <> "" Then
ws.Cells(Target.Row, 3).Value = UBound(Split(currentVal, ",")) + 1 & "件"
Else
ws.Cells(Target.Row, 3).Value = ""
End If
Application.EnableEvents = True
End Sub
UBound(Split(currentVal, “,")) + 1 で、カンマ区切りの文字列を配列に分割し、要素数(=選択件数)をカウントしています。
「営業部,総務部,経理部」なら3件、と自動でC列に表示されるため、すぐに入力状況の確認が可能。
関連記事「別シートにテキストを自動転記」では、シートを指定するVBA、転記VBAが設定されたエクセルファイルをダウンロードすることができます。
設定後の動作確認と注意点
コードを貼り付けたら、まず動作確認をしてみましょう。
Sheet1のB2セルをクリックしてドロップダウンリストが表示されることを確認したら、項目を1つ選んでみます。
次にもう一度同じセルをクリックし、別の項目を選ぶと、セルに「営業部,総務部」のようにカンマ区切りで追記されていれば成功です。
もし動作しない場合は、コードをシートモジュール(Sheet1)ではなく標準モジュールに書いていないか確認してください。
Worksheet_Change イベントは必ずシートモジュールに記述する必要があります。
また、エクセルの「マクロのセキュリティ」設定でマクロが無効になっている場合も動作しません。
「開発」タブ→「マクロのセキュリティ」から「警告を表示してすべてのマクロを無効にする」または「すべてのマクロを有効にする」に設定し直してください。
プルダウン複数選択VBAの実務活用事例
ここでは、私が実際にこのマクロを開発・利用した場面を紹介します。
案件管理表の「担当部署」列にこのマクロを適用したところ、従来は「複数部署の場合は手動でカンマ区切りに直す」という作業が発生していたのが、一切なくなりました。
1件の入力にかかっていた時間が平均20秒から3秒程度に短縮でき、100件以上のデータを入力する日は合計で20〜30分以上の節約となりあます。
活用例①|担当者を複数選んで管理表に自動入力
プロジェクト管理表でよく起きる「担当者が複数いる場合、どう記録するか」という問題を解決するのが、このマクロの典型的な使い道です。
C列に担当者リストのプルダウンを設定し、Worksheet_Change イベントで複数選択を有効にすると、「田中,佐藤,鈴木」のような形でセルに自動入力されます。
フィルター機能と組み合わせれば、「田中が担当している案件だけを表示する」といったデータ抽出も可能になります。
活用例②|チェックリストの複数項目に対応する
「実施した確認項目」を記録するチェックリストにも応用できます。
たとえば「書類確認・押印確認・送付確認・入金確認」というリストをプルダウンに設定し、作業が完了するたびに該当項目を選んでいくと、完了した項目がカンマ区切りでセルに蓄積されていきます。
全部の項目が選ばれたかどうかを COUNTIF 関数で判定し、条件付き書式でセルの色を変える仕組みと組み合わせることで、「全チェック完了かどうか」が一目でわかるシートができあがります。
関連記事「文字を〇で囲む操作を完全自動化」では、テキストを図形〇で囲むVBAが設定されたエクセルファイルをダウンロードすることができます。
活用例③|アンケート結果の複数回答を集計する
社内アンケートなどで「複数回答可」の質問がある場合にも役立ちます。
回答者が複数の選択肢を選べる仕組みをエクセルで実現でき、集計のときも Split 関数でカンマ区切りを配列に変換してから COUNTIF で集計するVBAを追加することで、自動集計レポートまで作成できます。
「アンケートの入力→集計→報告書作成」という一連の作業をVBAで自動化した事例として、私はこの仕組みを実際のクライアント案件で納品したことがあります。
VBAスキルを副収入に変える方法|私の体験談
ここまでプルダウンの複数選択VBAについて解説してきましたが、実はこのスキルを使って副収入を得ることも十分に可能です。
私自身の体験をお伝えします。
ココナラでVBAスキルを販売してみた結果
VBAを覚えてから「このスキルを収入につなげたい」と考え、スキルを販売できるプラットフォーム「ココナラ」に登録しました。
最初のうちは実績ゼロで信用がないため、なかなか仕事を受注できませんでした。
そこで自己紹介文やポートフォリオを充実させ、単価が低くても作業量をこなして実績数を積み重ねる戦略をとりました。
登録から約1年が経過した頃、ようやくVBAスキルを活かしたマクロ開発の依頼を安定して受注できるようになり、月に2万〜3万円の副収入を得られるようになりました。
リピートしてくれる依頼者も徐々に増え、「このマクロに機能を追加してほしい」という追加依頼でさらに収益が積み上がっていきました。
信頼度を上げるまでに時間はかかりましたが、VBAスキルで副収入を得ることは十分に実現可能だと実感しています。
ブログからの直接受注で手数料ゼロを実現
ある程度実績が積み上がったタイミングで、エクセルVBAのブログを立ち上げて情報を発信し始めました。
すると、ブログ経由でマクロ開発の直接依頼が来るように。
ブログからの直接受注にはいくつかのメリットがあります。
まずプラットフォームの手数料がかからないため、受け取る報酬がそのまま収入になります。
さらに打ち合わせの方法も自分で自由に決められるため、オンライン通話やメールなど、依頼者に合わせた対応が可能です。
ブログ経由の直接受注で月に3万〜4万円の収入を継続的に得られるようになりました。
VBAスキルで副業をお考えの方は、ぜひ関連記事「[【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで](https://mamemametochan.com/vba-syuunyuuget/)」も読んでみてください。
クラウドワークス テックで月10万円を目指す
さらに高単価・大規模な案件に挑戦したいと考え、クラウドワークス テック
への登録しました。
私の場合、本業以外の時間(1日4時間稼働可能)で完全リモートという条件で案件を紹介してもらいました。
担当者のサポートが手厚く、「どのような仕事なのか」「自分に務まるのか」を事前に詳しく確認することが可能。
結果として月に10万円程度の報酬を受け取ることができました。
ただし、仕事の内容や量によっては本業との掛け持ちがかなりきつく感じる場面もあるので注意してください。
VBAスキルで副業を検討する際は、報酬金額だけに目を向けず「自分に務まる作業量か」「本業に支障が出ない時間配分か」をしっかり確認してから決断することを強くおすすめします。
関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」では、私がゼロから副収入を得るまでの具体的なステップをまとめていますので、ぜひ合わせて読んでみてください。
まとめ ~ プルダウン複数選択VBAで入力作業をすっきり自動化しよう ~
この記事では、VBAを使ってプルダウンリストから複数の項目を選択・追記する方法を解説してきました。
Validation.Add メソッドでセルにドロップダウンリストを設定し、Worksheet_Change イベントと引数 Target を組み合わせることで、「選ぶたびにセルに追記される」という便利な入力フォームをエクセル上に作れます。
重複チェックやリセット機能、件数の自動カウントを組み合わせることで、実務で即使えるレベルのツールに仕上げることが可能。
最初はこの記事で紹介しているコードをそのままコピペして動かしてみるところから始めてみましょう。
「動いた!」という体験が積み重なると、自然と応用コードへの興味が湧いてきます。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。






