【Excelマクロ】ドロップダウンリストをVBAで自動生成

入力ミスを防ぐための工夫

Excelでは、ドロップダウンリスト(プルダウン)を使うことで、ユーザーの入力を一定の選択肢に限定できます。たとえば「部署名」や「ステータス」のように、入力値が決まっている場合にとても便利です。

この機能は通常、「データの入力規則」から手動で設定しますが、VBAを使えば自動で設定することも可能です。特に、繰り返し使う帳票やテンプレートにおいては、マクロでドロップダウンを作っておくと作業がとてもスムーズになります。

手動で行えるのにわざわざVBAを使うのは、例えば、何度もプルダウンの内容が変わる場合や、状況によりプルダウンの内容が変わる場合には、毎回「データの入力規則」から設定するのは面倒なので、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:リストの値をカンマ区切りで指定します。

このマクロを実行すると、「営業」「総務」「経理」の3つから選べるドロップダウンがB2セルに設定されます。

リストを別シートから読み込む場合

固定の選択肢ではなく、他のシートにあるリストを使いたいこともよくあります。そんなときは、次のように記述します。

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

解説

  • 選択肢のリストを別シートにしておくと、データの変更が柔軟になります。
  • 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化を検討してみてください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール