Excelのドロップダウンリストで複数選択する方法(3つのテクニック)
状況によっては、ドロップダウンリストから複数の値を選択したいケースがあります。本記事では、Excelのドロップダウンリストで複数選択を実現する3つの方法を、VBAコード付きでわかりやすく解説します。ここではExcel 2019を使用していますが、お好みのバージョンでも同様に操作できます。
解説に入る前に、まずは例題のベースとなるデータセットを確認しておきましょう。

ここにはいくつかの文房具アイテムが用意されています。このデータを使ってドロップダウンリストを作成し、そこから複数の項目を選択していきます。
なお、説明をシンプルにするために小さなデータセットを使用していますが、実際の業務ではもっと大規模で複雑なデータを扱うことになるでしょう。
練習用ワークブック
以下のリンクから練習用ワークブックをダウンロードできます。
ドロップダウンリストでの複数選択の準備
まず最初に、文房具のデータをもとにドロップダウンリストを作成します。手順は簡単なので、すぐに作ってみましょう。ドロップダウンリストの基本的な作成方法については、関連記事をご参照ください。
「データの入力規則」ダイアログボックスで「リスト」を選択し、アイテムが入力されたセル範囲を指定します。

B4:B11が文房具アイテムが格納されている範囲です。これでドロップダウンリストが使えるようになります。

関連記事: Excelのドロップダウンリストを選択内容に応じて切り替える方法
1. 複数項目を選択する(重複選択可)
通常のドロップダウンリストでは、1つの項目しか選択できません。下の画像では、リストから「ペン」を選択した状態です。

ここで別の項目、たとえば「鉛筆」を選択すると…

先ほどの値が上書きされ、「鉛筆」だけが残ります。

複数の項目を選択できるようにするには、VBAコードを使用する必要があります。Microsoft Visual Basic for Applicationsウィンドウを開きましょう(Alt + F11キーで開けます)。
次に、ドロップダウンリストで複数選択をしたいワークシート名(またはシート番号)をダブルクリックします。そのシート専用のコードウィンドウが表示されます。

ここでは、ドロップダウンリストがあるSheet2のコードウィンドウを開いています。
コードウィンドウが開いたら、以下のコードを貼り付けてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Oldvalue As String
Dim Newvalue As String
On Error GoTo Exitsub
If Target.Address = "$D$4" Then
If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
GoTo Exitsub
Else: If Target.Value = "" Then GoTo Exitsub Else
Application.EnableEvents = False
Newvalue = Target.Value
Application.Undo
Oldvalue = Target.Value
If Oldvalue = "" Then
Target.Value = Newvalue
Else
Target.Value = Oldvalue & ", " & Newvalue
End If
End If
End If
Application.EnableEvents = True
Exitsub:
Application.EnableEvents = True
End Sub

コードを保存したら、ドロップダウンリストから値を選択してみてください。

「鉛筆」を選んだ後、さらに別の項目「ノート」を選択してみます。すると、両方の項目が表示されました。

このコードでは、同じ項目を繰り返し選択することも可能です。もう一度「鉛筆」を選んでみると…

選択ボックスに同じ項目が再度追加されます。

コードの解説
まず、OldvalueとNewvalueという2つの文字列変数を宣言しています。
ドロップダウンリストはD4セルに作成しているため、ターゲットアドレスはD4です。また、Target.SpecialCellsを使って、対象セルがデータの入力規則を持っているかどうかも確認しています。
値が選択されたら、イベントの連鎖を防ぐためイベントを一時的に無効化し(Application.EnableEvents = False)、選択された項目をNewvalueに格納します。
その後、変更を元に戻す(Undo)ことで直前の値をOldvalueとして取得します。Oldvalueが空であれば(つまり最初の1つ目の選択であれば)Newvalueをそのまま返し、空でなければOldvalueとNewvalueをカンマ区切りで連結します。
最後にイベントを再び有効化して終了です。これにより、以降の変更にも対応できるようになります。
関連記事: Excel VBAで複数の依存型ドロップダウンリストを作成する方法
2. ドロップダウンリストから複数選択する(重複不可)
前のセクションでは、重複を許可する複数選択を紹介しました。同じ項目を二度選ばれたくない場合は、こちらの方法を試してください。
説明のため、今回は別のシートを使用します。Sheet3のコードウィンドウに、以下のコードを記述してください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Oldvalue As String
Dim Newvalue As String
Application.EnableEvents = True
On Error GoTo Exitsub
If Target.Address = "$D$4" Then
If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
GoTo Exitsub
Else: If Target.Value = "" Then GoTo Exitsub Else
Application.EnableEvents = False
Newvalue = Target.Value
Application.Undo
Oldvalue = Target.Value
If Oldvalue = "" Then
Target.Value = Newvalue
Else
If InStr(1, Oldvalue, Newvalue) = 0 Then
Target.Value = Oldvalue & ", " & Newvalue
Else:
Target.Value = Oldvalue
End If
End If
End If
End If
Application.EnableEvents = True
Exitsub:
Application.EnableEvents = True
End Sub

先ほどのコードと何が違うのか、よく見るとわずかな違いがあることに気づくでしょう。
ここではInStrというVBA関数を使用しています。InStr関数は、文字列の中で指定した部分文字列が最初に出現する位置を返します。詳細はInStr関数の解説記事をご覧ください。
InStr(1, Oldvalue, Newvalue) = 0という論理式で、選択しようとした値が既に存在するかどうかをチェックしています。結果がTRUE(まだ選択されていない)の場合のみ、項目を選択して既存の値に連結できる仕組みです。
コードを保存したら、すでに選択済みの項目をもう一度選んでみてください。

ここではすでに「鉛筆」を選択しているため、もう一度選ぼうとしても追加されません。重複した値は許可されないのです。
関連記事: Excelで別シートのデータからドロップダウンリストを作成する方法
3. 選択項目を改行で区切って表示する
ここまでの方法では、選択した項目がカンマで区切られていました。このセクションでは、選択項目を改行して縦に並べて表示する方法を紹介します。
簡単のため、D4セルといくつかのセルを結合します。結合したいセル範囲を選択し、「ホーム」タブの「配置」グループにある「結合して中央揃え」をクリックしましょう。

セルの高さが大きくなります。

それでは、項目を改行で区切るためのコードを見てみましょう。以下のコードを使用します。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Oldvalue As String
Dim Newvalue As String
Application.EnableEvents = True
On Error GoTo Exitsub
If Target.Address = "$D$4" Then
If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
GoTo Exitsub
Else: If Target.Value = "" Then GoTo Exitsub Else
Application.EnableEvents = False
Newvalue = Target.Value
Application.Undo
Oldvalue = Target.Value
If Oldvalue = "" Then
Target.Value = Newvalue
Else
If InStr(1, Oldvalue, Newvalue) = 0 Then
Target.Value = Oldvalue & vbNewLine & Newvalue
Else:
Target.Value = Oldvalue
End If
End If
End If
End If
Application.EnableEvents = True
Exitsub:
Application.EnableEvents = True
End Sub

前のコードとの唯一の違いは、OldValueとNewValueの間にvbNewLineを使用した点です。
vbNewLineは項目間に改行を挿入する定数です。
それでは、実際に項目を選択してみましょう。

上の画像のように「ペン」を選択しました。続けて別の項目を選びます。

2つの項目が別々の行に表示されます。

さらに別の値を選択すると、新しい行に追加されていきます。すべての値がそれぞれ独立した行に並ぶのです。

なお、カンマ以外の区切り文字を使いたい場合は、vbNewLineの代わりにダブルクォーテーションで囲んだ任意の文字列を指定すればOKです。
まとめ
今回は、ドロップダウンリストで複数選択を実現する複数のアプローチを紹介しました。皆さんの作業効率アップに役立てば幸いです。わかりにくい点があれば、お気軽にコメントください。また、ここで紹介しきれていない他の方法があれば、ぜひ教えてください。
関連記事
- Excelで複数列にドロップダウンリストを作成する方法(3選)
- Excelでセルの値とドロップダウンリストを連動させる方法(5選)
- Excelの条件付きドロップダウンリスト(作成・並べ替え・活用術)
- Excelで動的な依存型ドロップダウンリストを作成する方法
- IF関数を使ってExcelにドロップダウンリストを作成する方法
- ExcelでVLOOKUPとドロップダウンリストを組み合わせる方法
-
Excelで複数のセルにハイパーリンクを設定する3つの方法
Microsoft Excelにおけるハイパーリンクは、特定のWebページへのリンクとして活用されるだけでなく、別のファイルやExcelシート、さらには特定のセルへジャンプできる便利な機能です。ハイパーリンクをクリックするだけで、ブック内の目的の場所へ素早く移動できます。この記事では、Excelで複数のセルにハイパーリンクを設定する方法を3つご紹介します。説明が分かりやすいよう、Excel関連のトピック名とWebアドレスを含むサンプルデータを使用します。Excelで複数のセルにハイパーリンクを設定する3つの方法本記事では、HYPERLINK関数と「挿入」オプションを使って、複数のセルにハイパー
-
Excelのリストからメールを一括送信する2つの効果的な方法
大勢の人に一括メールを送りたいとき、繰り返し作業を素早く処理できる自動化の仕組みが必要になります。メールアドレスの一覧をまとめたExcelファイルを作成するのが、一括メール送信の最も一般的な方法です。このチュートリアルでは、Excelのリストから多数の相手へ自動的にメールを送信する方法を、2つのアプローチで詳しく解説します。 Excelリストからメールを送信する2つの便利な方法 下の画像には、氏名・メールアドレス・登録番号を含むデータセットが用意されています。このExcelリストから、それぞれの相手に個別のメールを送信していきます。そのために、まずMicrosoft Wordの差し込み印刷機能