ExcelのVBAでドロップダウンリスト(プルダウン)を自動生成するには、Validation.Add メソッドを使います。固定の選択肢はカンマ区切りで直接指定、変動するリストは別シートの範囲を参照することで、入力ミスの防止と保守性の向上が両立できます。
この記事では、次の3パターンを順番に解説します。
- 固定リストをVBAで直接設定する方法
- 別シート(マスタ)のリストを参照する方法
- 1セルずつ異なる値をドロップダウンに設定する方法
なぜVBAでドロップダウンを設定するのか?
Excelでは「データの入力規則」から手動でドロップダウンを設定できます。しかし、次のようなケースでは手動設定が非効率になります。
- プルダウンの内容が定期的に変わる
- 複数の帳票・シートに同じ設定が必要
- 状況によって選択肢が変わる(担当者・ステータスなど)
こういった場面でVBAを使うと、マクロを1回実行するだけで常に最新の状態に更新できるようになります。
VBAでドロップダウンリストを設定するには?(基本)
まずは、固定の選択肢をVBAで設定するシンプルなコードを紹介します。
Sub AddDropdownList()
' B2セルにドロップダウンを設定
With ThisWorkbook.Sheets("入力シート").Range("B2")
.Validation.Delete ' 既存の入力規則を削除
.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:="営業,総務,経理"
End With
End Sub
コードの解説
Validation.Delete:既存の入力規則を削除します。二重設定を防ぐために必ず入れましょう。Validation.Add:新しい入力規則(リスト型)を追加します。Formula1:リストの値をカンマ区切りで指定します。
このマクロを実行すると、B2セルに「営業」「総務」「経理」の3つから選べるドロップダウンが設定されます。
別シートのリストをドロップダウンに使うには?
選択肢が増減する場合や、複数の帳票で同じリストを使いまわしたい場合は、マスタシートのリストを参照する方法が便利です。
Sub AddDropdownFromList()
Dim ws As Worksheet
Dim listWs As Worksheet
Dim lastRow As Long
Dim listRange As String
Set ws = ThisWorkbook.Sheets("入力シート")
Set listWs = ThisWorkbook.Sheets("マスタ")
' マスタシートのA列に選択肢があると仮定
lastRow = listWs.Cells(listWs.Rows.Count, 1).End(xlUp).Row
listRange = "=マスタ!$A$2:$A$" & lastRow
With ws.Range("B2")
.Validation.Delete
.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:=listRange
End With
End Sub
コードの解説
- マスタシートのA列にある選択肢を、行数を自動で取得して参照します。
Formula1には=シート名!$列$行の形式で絶対参照を使います。- マスタのリストを変更するだけでドロップダウンの選択肢が更新されるため、メンテナンスが非常に楽になります。
注意点:名前付き範囲を使うとさらに安定する
他シートの範囲を直接指定すると、シート名変更時にエラーになることがあります。あらかじめ「名前付き範囲」を設定し、Formula1:="=部署一覧" のように名前で参照するとより安定します。
行ごとに異なる値をドロップダウンに設定するには?
1セルずつ異なる選択肢を設定したい場合は、ループ処理を使います。マスタリストの値を1件ずつ取り出して、対応するセルに個別のドロップダウンとして設定します。
Sub AddDropdownEachRow()
Dim ws As Worksheet
Dim listWs As Worksheet
Dim i As Long
Dim lastRow As Long
Dim value As String
Set ws = ThisWorkbook.Sheets("入力シート")
Set listWs = ThisWorkbook.Sheets("マスタ")
' マスタシートのA列に選択肢があると仮定
lastRow = listWs.Cells(listWs.Rows.Count, 1).End(xlUp).Row
' マスタのリストを1件ずつB列に順番に設定
For i = 2 To lastRow
value = listWs.Cells(i, 1).Value
With ws.Cells(i, 2)
.Validation.Delete
.Validation.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:=value
End With
Next i
End Sub
コードの解説
- 「マスタ」シートのA列を上から順に1件ずつ取得します。
- 「入力シート」のB列の各セルに、それぞれ個別の値をドロップダウンとして設定します。
- 各セルに「1つだけ」の選択肢が入る状態になります(固定値としての使い方)。
VBAでドロップダウンを自動生成するメリットは?
ドロップダウンをマクロで管理することで、次のような効果が得られます。
- 入力ミスを防げる:「営業所」「営業しょ」などの表記ゆれを防止し、データの統一性を保てます。
- 複数の帳票で使いまわせる:マスタを1か所管理するだけで、すべての帳票に反映されます。
- 常に最新のリストに自動更新できる:シートを開いたタイミングでマクロを走らせれば、選択肢が自動で最新化されます。
- 設定漏れがなくなる:手作業では起きやすい「このセルだけ設定し忘れた」を防げます。
まとめ
VBAでドロップダウンリストを自動生成するには、Validation.Add メソッドを使います。用途に応じて次の3パターンを使い分けましょう。
- 固定リスト:
Formula1にカンマ区切りで直接記述。選択肢が変わらない場合に最適。 - 別シート参照:マスタシートの範囲を
Formula1で参照。選択肢を一元管理したい場合に便利。名前付き範囲を使うとさらに安定する。 - 行ごとに個別設定:ループ処理で1セルずつ設定。行によって異なる値を割り当てたい場合に使う。
ドロップダウンの設定を毎回手動で行っている方は、ぜひVBA化を検討してみてください。一度マクロを作っておくだけで、以降の手間が大幅に減ります。
よくある質問
VBAでドロップダウンを設定すると、既存の入力規則は消えますか?
はい、消えます。Validation.Delete を実行すると、そのセルに設定されていた既存の入力規則はすべて削除されます。上書きではなく削除してから再設定する仕様のため、コードの先頭に必ず Validation.Delete を入れるのが基本です。
ドロップダウンの選択肢に全角・半角の混在があっても動きますか?
動きますが、比較処理や集計処理で問題になる場合があります。たとえば「営業」(全角)と「営業」(半角)は別の文字列として扱われます。マスタシートで表記を統一しておくことを推奨します。
Validation.Add を実行するとエラーになる場合は?
最も多い原因は、Validation.Delete を入れ忘れていることです。既存の入力規則が残った状態で Validation.Add を実行すると実行時エラーになります。また、Formula1 に指定した別シートの範囲が存在しない場合もエラーになるため、シート名・範囲名のスペルを確認してください。
複数のセルにまとめてドロップダウンを設定することはできますか?
できます。Range("B2:B10") のように範囲を指定すると、まとめて同じドロップダウンを設定できます。行ごとに異なる選択肢を設定したい場合は、ループ処理(For i = 2 To lastRow)を使ってください。
マクロを使わずにVBAで設定したドロップダウンを削除するには?
通常の手動操作(データ → データの入力規則 → すべてクリア)で削除できます。VBAで設定したものも、Excelの入力規則として保存されているため、手動でも削除・編集が可能です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



