Contents
この記事でできること
毎月、新しいシートを作るたびに「部署名」のドロップダウンリストを手動で設定していた。データの入力規則→リスト→選択肢を入力…を毎回やるのが地味に面倒だった。しかもコピペミスで選択肢が微妙に違うシートが生まれて、集計時に「営業部」と「営業 部」(← 半角スペース混入)が別カウントになって混乱した。
この記事のVBAを使えば、指定した範囲にドロップダウンリスト(入力規則)を一括設定できる。手動で1セルずつ設定する必要はない。マクロを実行するだけで、全対象セルにドロップダウンが自動で付く。
- 対象:管理表や入力フォームでドロップダウンリストを設定する作業がある人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
ドロップダウンの選択肢に使うマスタリスト(ユニークリスト)の作り方は 【VBA】重複データを一括削除して一意のリストを作る方法 を参照。既存データから重複を除いた一覧をそのまま選択肢に使える。
完成イメージ(Before / After)
Before(実行前)
C列「部署」にドロップダウンリストが設定されていない。自由入力のため表記ゆれが発生している。
| A | B | C | |
|---|---|---|---|
| 1 | 氏名 | 社員番号 | 部署 |
| 2 | 山田太郎 | 001 | 営業部 |
| 3 | 鈴木花子 | 002 | 営業 部 ← 半角スペース混入 |
| 4 | 田中一郎 | 003 | (空欄) |
| 5 | 佐藤次郎 | 004 | けいりぶ |
After(実行後)
C列にドロップダウンリストが設定される。選択肢から入力できるため表記ゆれが防げる。
| A | B | C | |
|---|---|---|---|
| 1 | 氏名 | 社員番号 | 部署 ▼ |
| 2 | 山田太郎 | 001 | (ドロップダウンから選択) |
| 3 | 鈴木花子 | 002 | (ドロップダウンから選択) |
選択肢:営業部, 経理部, 総務部, 製造部, 品質管理部
実行前の準備
バックアップを取る
対象のExcelファイルをコピーしてバックアップを取ること。入力規則の設定は既存の入力規則を上書きする。
Excelをマクロ有効ブック(.xlsm)で保存する
- 対象のExcelファイルを開く
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- コード内の
targetRangeとlistItemsを自分の環境に合わせて書き換える - 対象のシートを表示した状態で Alt + F8 を押す
- 「SetDropdown」を選択して「実行」
- 指定範囲にドロップダウンリストが設定される
コード(最小版)– 選択肢をコード内に書いて一括設定
まずはこれだけで動く。指定した範囲にドロップダウンリストを設定する。選択肢はコード内にカンマ区切りで書く。
Sub SetDropdown()
Dim rng As Range
Dim listItems As String
' --- ★ ここを設定したい範囲に書き換える ---
Set rng = ActiveSheet.Range("C2:C100")
' --- ★ ここに選択肢をカンマ区切りで書く ---
listItems = "営業部,経理部,総務部,製造部,品質管理部"
' 既存の入力規則を削除(これをしないとエラーになる)
rng.Validation.Delete
' ドロップダウンリスト(入力規則)を設定
rng.Validation.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:=listItems
' ガイドメッセージを設定(セル選択時に表示)
rng.Validation.InputTitle = "入力方法"
rng.Validation.InputMessage = "ドロップダウンから選択してください。"
MsgBox "ドロップダウンリストを設定しました。" & vbCrLf & _
"対象:" & rng.Address, vbInformation
End Sub
コードの動作:
- 対象範囲(C2:C100)の既存の入力規則を削除
Validation.Addでリスト型の入力規則を設定Formula1にカンマ区切りで選択肢を指定AlertStyle:=xlValidAlertStopで、リスト外の値の入力を拒否- セル選択時にガイドメッセージを表示
対象範囲について: Range("C2:C100") の部分を自分の環境に合わせて書き換える。ヘッダー行(1行目)は含めない。
選択肢について: listItems に半角カンマ(,)区切りで指定する。選択肢が多く255文字を超える場合は、下の実務版(マスタシート方式)を使うこと。
これを最初からやっておけばよかった。選択肢が統一されるだけで、集計時の「営業部」と「営業 部」問題が消えた。
コード(実務版)– マスタシートの値を読み込んで一括設定
業務で使うなら、選択肢が増えるたびにコードを書き換えたくない。マスタシートに選択肢を書いておけば、マスタを更新するだけでドロップダウンの選択肢も変わる。
ドロップダウンの選択後に自動で行の色を変えたい場合は 【VBA】セルの値に応じて行を自動色分けする方法 と 【VBA】セルの値が変わったら自動実行する方法(Worksheet_Change) を組み合わせると実現できる。
マスタシート「マスタ」の構成:
| A | |
|---|---|
| 1 | 部署名 |
| 2 | 営業部 |
| 3 | 経理部 |
| 4 | 総務部 |
| 5 | 製造部 |
| 6 | 品質管理部 |
Sub SetDropdownFromMaster()
Dim wsTarget As Worksheet
Dim wsMaster As Worksheet
Dim rng As Range
Dim masterCol As Long
Dim masterLastRow As Long
Dim listFormula As String
' --- ★ ここを書き換える ---
Set wsTarget = ThisWorkbook.Worksheets("Sheet1") ' ドロップダウンを設定するシート
Set rng = wsTarget.Range("C2:C100") ' ドロップダウンを設定する範囲
Set wsMaster = ThisWorkbook.Worksheets("マスタ") ' 選択肢が書いてあるシート
masterCol = 1 ' マスタの列番号(A列=1)
' マスタシートの最終行を取得
masterLastRow = wsMaster.Cells(wsMaster.Rows.Count, masterCol).End(xlUp).Row
If masterLastRow < 2 Then
MsgBox "マスタシートにデータがありません。", vbExclamation
Exit Sub
End If
' マスタシートのセル範囲を参照する式を作成
listFormula = "=" & wsMaster.Name & "!$" & _
Chr(64 + masterCol) & "$2:$" & Chr(64 + masterCol) & "$" & masterLastRow
' 既存の入力規則を削除
rng.Validation.Delete
' ドロップダウンリスト(入力規則)を設定
rng.Validation.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Formula1:=listFormula
' ガイドメッセージ
rng.Validation.InputTitle = "入力方法"
rng.Validation.InputMessage = "ドロップダウンから選択してください。"
' エラーメッセージ
rng.Validation.ErrorTitle = "入力エラー"
rng.Validation.ErrorMessage = "リストにない値は入力できません。" & vbCrLf & _
"ドロップダウンから選択してください。"
MsgBox "ドロップダウンリストを設定しました。" & vbCrLf & _
"対象:" & rng.Address & vbCrLf & _
"選択肢:" & wsMaster.Name & "シートの" & (masterLastRow - 1) & "件", vbInformation
End Sub
追加ポイント:
- マスタシートの値を
Formula1でセル範囲参照(コードを書き換えずに選択肢を追加・変更可能) - マスタシートの最終行を自動検出(行数が変わっても対応)
ErrorTitle/ErrorMessageでリスト外の値を入力した場合のエラーメッセージをカスタマイズ
※ masterCol は26以下(A〜Z列)で動作する。AA列以降を使う場合はコードの修正が必要。
マスタシートの準備: 「マスタ」という名前のシートを作成し、A列に選択肢を書いておく。1行目はヘッダー、2行目以降がデータ。選択肢を追加したい場合は、マスタシートに行を追加してマクロを再実行するだけ。
注意: マスタシート名に空白がある場合(例:「マスタ リスト」)は、コード内のシート名をシングルクォートで囲む必要がある。シート名は空白を含めないのが無難。
よくある落とし穴5選
自分が初めて Validation.Add を実行したとき、「実行時エラー 1004」が出た。原因は、対象セルに既存の入力規則が残っていたこと。先に Validation.Delete で消してから Add しないとエラーになると知るまで30分ハマった。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「実行時エラー 1004」が出る | 対象セルに既存の入力規則が残っている | Validation.Delete を Validation.Add の前に必ず実行する |
| 2 | 選択肢が表示されない / 1つしか表示されない | 全角カンマ(,)で区切っている、またはFormula1の文字列が255文字を超えている | 半角カンマ(,)で区切る。255文字を超える場合はマスタシート参照方式を使う |
| 3 | マスタシート参照で選択肢が出ない | Formula1 のシート参照が間違っている(シート名の不一致、絶対参照の欠落) | "=マスタ!$A$2:$A$100" のようにシート名と絶対参照を正確に指定する |
| 4 | 入力規則を設定したのに既存の値がそのまま残る | 入力規則は設定後に入力される値だけを制限する。既存の値は変更されない | 既存値のチェックが必要なら、設定後に目視確認するか、別途VBAでチェック処理を追加 |
| 5 | ドロップダウンの矢印が表示されない | セルを選択していない状態で確認している。矢印はセルを選択したときだけ表示される | 対象セルをクリックして選択すると、右側にドロップダウンの▼が表示される |
FAQ
Q1: 選択肢を後から追加したい
マスタシート方式なら、マスタシートに行を追加してマクロを再実行するだけ。コード内に書く方式なら、listItems を書き換えて再実行する。
Q2: 入力規則を一括解除したい
以下の1行で解除できる。
ActiveSheet.Range("C2:C100").Validation.Delete
対象範囲を書き換えて実行する。
Q3: ドロップダウンを選択したら自動で色が変わるようにしたい
【VBA】セルの値に応じて行を自動色分けする方法 の色分けロジックと、【VBA】セルの値が変わったら自動実行する方法(Worksheet_Change) を組み合わせれば、ドロップダウンの選択をトリガーに行の色を自動変更できる。
Q4: 連動ドロップダウン(都道府県→市区町村)を作りたい
INDIRECT関数+名前の定義が必要になり、コードが複雑になるため記事の範囲外。ココナラで相談を推奨。
Q5: リスト外の値を入力したときに警告だけ出したい(入力は許可したい)
AlertStyle:=xlValidAlertStop を xlValidAlertWarning に変えると、警告メッセージは出るが入力自体は許可される。
rng.Validation.Add _
Type:=xlValidateList, _
AlertStyle:=xlValidAlertWarning, _
Formula1:=listItems
まとめ
この記事で、指定範囲にドロップダウンリスト(入力規則)をVBAで一括設定できるようになった。
- 最小版:選択肢をコード内にカンマ区切りで指定して一括設定
- 実務版:マスタシートの値を読み込んで一括設定(選択肢の追加がコード修正なしで可能)
重要なのは、Validation.Add の前に Validation.Delete を実行すること。これを忘れるとエラーになる。
関連記事
- 【VBA】重複データを一括削除して一意のリストを作る方法 — 既存データからユニークリストを作り、マスタとして活用できる
- 【VBA】セルの値に応じて行を自動色分けする方法 — ドロップダウンの選択値に応じて行を色分けしたい場合
- 【VBA】セルの値が変わったら自動実行する方法(Worksheet_Change) — ドロップダウンの選択をトリガーに処理を自動実行したい場合
次にやりたくなること
- 【VBA】ExcelファイルをPDFに一括変換する方法 — 入力が完了した表をPDFにして上司に提出したい場合はこちら
- 【VBA】ExcelからOutlookメールを自動作成する方法 — 入力完了後にメールで送信したい場合はこちら
もっとカスタマイズしたい場合
「連動ドロップダウン(都道府県→市区町村)を作りたい」「入力規則+自動色分けを1つのマクロにまとめたい」「複数シートに同じドロップダウンを一括設定したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- ドロップダウンの設定箇所(列数・シート数)
- 選択肢の数と管理方法(コード内 or マスタシート)
- 連動の有無(例:大分類→小分類)

コメント