Excel VBA 入力規則で動的にプルダウンリストの作成とリストを自動更新する方法

ExcelVBA-実用編

今回はExcel VBAでExcel機能の入力規則を操作して、プルダウンリストを作成する方法をご説明します。

セルの範囲をリストに設定する基本的な方法から、配列に格納された値をリストに設定する方法、リストに変更が発生したら自動的に更新する方法までご説明します。

VBAを使わずにExcelで入力規則を作成する方法は「Excel 入力規則でプルダウンリストの作成方法」をご覧ください。

連動するリストのさくせいほうほうについては、下記記事をご覧ください。

1.入力規則とは

操作の説明をする前に、Excelの入力機能について簡単に説明します。

入力規則で出来る事

数値、日付、文字列、文字数など入力する値を制限できます。

ヒントやエラーメッセージ、IME 等も設定できます。

そして、今回使用するプルダウンリストを作成する事ができます。

プルダウンリストを作成するメリット

プルダウンメニューを作成する事で、次のようなメリットがあります。

  • 入力する値を統一できる
  • 入力するリストを簡単に追加できる
  • 自分以外のユーザーの入力制限をする事ができる
  • VLOOKUPやCOUNTIF、SUMIF関数と併用で集計を簡易化出来る

上記以外にも多くのメリットがあります。

2.入力規則の削除方法

セルに入力規則を設定する方法を説明する前に、入力規則の削除方法について説明します。

理由は、すでにセルに入力規則が設定されている場合はエラーとなります。

ですので、基本的に入力規則を設定する前に既存の入力規則を削除します。

削除するには設定されているセル(オブジェクト)の「Validationオブジェクト」を操作します。

記述方法は簡単で次のように記述します。

Range("設定されている範囲").Validation.Delete

3.入力規則のValidationオブジェクトと引数の説明

セルに入力規則を作るには、「Validationオブジェクト」の「Addメソッド」を使います。

そして引数でそれぞれ詳細を設定します。

次のように記述します。

Validation.Add Type,AlertStyle,Operator,Formula1,Formula2

Validationの引数一覧

引数名省略説明
Type必須入力値の種類を指定します。
AlertStyle省略可能エラー時の動作を指定します。
Operator省略可能指定された値を比較する方法を指定します。
Formula1省略可能リストに指定したい値を指定します。
Formula2省略可能引数「Operator」で「xlBetween」もしくは「xlNotBetween」 を
指定した場合に、入力できる範囲の最大もしくは最小を指定します。
Typeの定数一覧

「Type」は 入力規則の種類を指定します。

Excelでは次の画面の操作になります。

定数数値説明
xlInputOnly0すべての値
xlValidateWholeNumber1整数
xlValidateDecimal2小数点
xlValidateList3リスト指定
xlValidateDate4日付指定
xlValidateTime5日時指定
xlValidateTextLength6文字列(長さ指定)
xlValidateCustom7ユーザ設定
AlertStyleの定数一覧

「AlertStyle」はエラー時の動作を指定します。

Excelでは次の画面の操作になります。

定数数値説明
xlValidAlertStop1停止
xlValidAlertWarning2注意
xlValidAlertInformation3情報
Operatorの定数一覧

「Operator」は指定された値を比較する方法を指定します。

「Type」で「 整数 」、「 小数点 」、「 日付指定 」、「日時指定」、「文字列(長さ指定)」 を選択時に指定する事ができます。

それ以外の「すべての値」、「リスト」、「ユーザ設定」では指定できません。

Excelでは次の画面の操作になります。

4.プルダウンリストの作成

リストの作成方法をサンプルコードを使ってご説明します。

次のようなA列にリストが入力されているサンプルデータを使用します。

Sub Sample1()
 
'既存の入力規則を削除
With ActiveSheet

    .Range("C1").Validation.Delete
     
    '入力規則を設定
    .Range("C1").Validation.Add Type:=xlValidateList, Formula1:="=$A$1:$A$6"

End With
 
End Sub

もちろん1つのセルではなく範囲を指定して設定することも可能です。

次のように記述します。

Sub Sample2()
 
'既存の入力規則を削除
With ActiveSheet

    .Range("C1:C5").Validation.Delete
     
    '入力規則を設定
    .Range("C1:C5").Validation.Add Type:=xlValidateList, Formula1:="=$A$1:$A$6"

End With
 
End Sub

5.動的にプルダウンリストを作成

固定のセル範囲をもとにプルダウンリストの作成方法はできましたが、リストが追加されるたびに範囲を再設定するのは非常に非効率ですので、自動でリストの範囲を取得して設定する方法をご説明します。

次の表のサンプルデータを使用します。

Sub Sample3()

Dim ListArray() As Variant
Dim ListStr     As String
Dim MaxRow      As Long
Dim i           As Long
 
'既存の入力規則を削除
With ActiveSheet

    .Range("C1:C5").Validation.Delete
     
    'データを取得する
    MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row
    ReDim ListArray(MaxRow - 1)
    
    For i = 1 To MaxRow
    
        ListArray(i - 1) = Cells(i, 1).Value
    
    Next i
    
    ListStr = Join(ListArray, ",")
     
    '入力規則を設定
    .Range("C1:C5").Validation.Add Type:=xlValidateList, Formula1:=ListStr

End With
 
End Sub

コードの説明です。

まずは固定の設定同様に、既存の入力規則の設定を削除します。

「MaxRow = Cells(Rows.Count, 1).End(xlUp).Row」でリストにしたい列の最終行を取得して、配列に格納します。

「ReDim ListArray(MaxRow – 1)」で配列の領域を指定します。

あとはループで配列にリストの値を格納します。

「ListStr = Join(ListArray, “,”)」で格納した配列の要素をJoin関数でカンマ区切りにして結合します。

それを「Formula1:=ListStr」で指定する事でリストが登録されます。

空白も除外されてリストが作成されました。

6.自動的にリストを追加する方法

上記のコードを組めば常に最新のリストが登録される訳ではありません。

常に最新のリストを追加させるにはいくつか方法があります。

ファイルを開いた時に更新する方法

リストを追加して、次回ファイルを開いた時に最新のリストになるようにする場合です。

ファイルを開いた時にマクロを自動的に実行する方法の詳細は「ファイルを開く時にマクロを実行する方法」をご覧ください。

先ほどのSampl3のマクロを使用します。

次のコードを「ThisWorkbookモジュール」に記述します。

Private Sub Workbook_Open()
Call Sample3
End Sub

これだけです。

これでファイルが開いた時にリストを作成するSample3のコードが実行され、ファイルを開くたびに最新のリストになります。

セルに変更があるたびに最新のリストに更新する方法

次はもっと更新頻度を増やす場合です。

リストが追加された場合に、毎回すぐ最新のリストになるようにします。

同様に、先ほどのSampl3のマクロを使用します。

次のコードを「Sheetモジュール」に記述します。

もしリストの追加の対象がSheet1であればSheet1モジュールに記述です。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Intersect(Target, Columns(1)) Is Nothing Then
    
        Exit Sub
        
    Else
    
        Call Sample3
        
    End If
    
End Sub

今回のサンプルデータはA列にリストを作成したので、A列のセルに変更が生じた場合にSample3が実行されます。

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