【VBA】入力規則(ドロップダウンリスト)を一括設定する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

毎月、新しいシートを作るたびに「部署名」のドロップダウンリストを手動で設定していた。データの入力規則→リスト→選択肢を入力…を毎回やるのが地味に面倒だった。しかもコピペミスで選択肢が微妙に違うシートが生まれて、集計時に「営業部」と「営業 部」(← 半角スペース混入)が別カウントになって混乱した。

この記事の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)で保存する

  1. 対象のExcelファイルを開く
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。


手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
  2. コード内の targetRangelistItems を自分の環境に合わせて書き換える
  3. 対象のシートを表示した状態で Alt + F8 を押す
  4. 「SetDropdown」を選択して「実行」
  5. 指定範囲にドロップダウンリストが設定される

コード(最小版)– 選択肢をコード内に書いて一括設定

まずはこれだけで動く。指定した範囲にドロップダウンリストを設定する。選択肢はコード内にカンマ区切りで書く。


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

コードの動作:

  1. 対象範囲(C2:C100)の既存の入力規則を削除
  2. Validation.Add でリスト型の入力規則を設定
  3. Formula1 にカンマ区切りで選択肢を指定
  4. AlertStyle:=xlValidAlertStop で、リスト外の値の入力を拒否
  5. セル選択時にガイドメッセージを表示

対象範囲について: 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.DeleteValidation.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:=xlValidAlertStopxlValidAlertWarning に変えると、警告メッセージは出るが入力自体は許可される。


rng.Validation.Add _
    Type:=xlValidateList, _
    AlertStyle:=xlValidAlertWarning, _
    Formula1:=listItems

まとめ

この記事で、指定範囲にドロップダウンリスト(入力規則)をVBAで一括設定できるようになった。

  • 最小版:選択肢をコード内にカンマ区切りで指定して一括設定
  • 実務版:マスタシートの値を読み込んで一括設定(選択肢の追加がコード修正なしで可能)

重要なのは、Validation.Add の前に Validation.Delete を実行すること。これを忘れるとエラーになる。

関連記事

次にやりたくなること


もっとカスタマイズしたい場合

「連動ドロップダウン(都道府県→市区町村)を作りたい」「入力規則+自動色分けを1つのマクロにまとめたい」「複数シートに同じドロップダウンを一括設定したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • ドロップダウンの設定箇所(列数・シート数)
  • 選択肢の数と管理方法(コード内 or マスタシート)
  • 連動の有無(例:大分類→小分類)

コメント

タイトルとURLをコピーしました