Excel VBAでデータ入力をスマートに!入力値に合わせた選択肢の表示方法

2024年2月5日

Excelを使ったアンケートやデータ収集において、ユーザーエクスペリエンスの向上は重要です。中でも、入力値に応じて選択肢を動的に表示することは、データ入力をスムーズに行うための手法です。この記事では、Excel VBAを利用して、入力値に合わせた選択肢の表示を簡単かつ効果的に行う方法について紹介します。

サンプルアプリの利用方法

サンプルアプリを利用するためには、以下の手順に従います。
まず、以下のようにカテゴリに応じて表示される商品を指定します。

次に、Excelファイルを開き、「Sheet2」に以下のように選択肢を表として作成し、一旦ファイルを閉じます。


再度、ファイルを開くと、入力セル(C列)にデータ検証用の選択肢が表示されます。

入力セルに選択された値に応じて、別のセル(D列)に対応する選択肢が表示されます。

これにより、ユーザーは直感的かつ効率的に選択肢を入力できます。

サンプルアプリの有用性

このサンプルアプリの有用性は、以下の点にあります。
ユーザビリティ向上:
ユーザーが利用しやすいインタラクティブな形式で選択肢を提示することで、Excelの利用が簡単になります。
入力エラーの防止:
データ検証を利用することで、誤ったデータの入力を防ぎます。
柔軟性と拡張性:
サンプルコードを元にして、他のセルや範囲にも同様の機能を拡張できます。

コード作成のポイント

このサンプルアプリのコードを理解するために、以下のポイントに注目します。
データ検証の設定:
データ検証は、選択肢が表示される範囲に対して行います。具体的な選択肢は別シートから取得しています。
データ検証(Data Validation)は、Excelに組み込まれた機能の一つで、特定のセルに対して入力できるデータの種類や範囲を制限するための機能です。主にデータの正確性や整合性を確保し、入力エラーを防ぐために利用されます。
セルの名前付け:
選択肢が表示される範囲の上にある行の値を利用して、セルに名前を付けています。
動的な選択肢の設定:
選択された値に基づいて、動的な選択肢を設定しています。これにより、選択肢が動的に変化します。

コード作成のフロー

コードの作成フローは以下の通りです。
Workbook_Openイベント:
Workbookが開かれるとイベントが発生し、その中で以下の処理が行われます。
データ検証用の選択肢の設定:
選択肢が表示されるセル範囲にデータ検証(Data Validation)を設定します。
セルに名前を付ける:
選択肢が表示される範囲の上にある行の値を利用して、セルに名前を付けます。
動的な選択肢の設定:
選択された値に基づいて、動的な選択肢を設定します。

サンプルアプリのコード   アプリの作成手順はこちら

以下が、サンプルアプリのコードです。

Private Sub Workbook_Open()

'Worksheetオブジェクトを入れる変数を宣言
 Dim Ws1, Ws2 As Worksheet
  
'Worksheetオブジェクトを取得
 Set Ws1 = Worksheets("Sheet1")
 Set Ws2 = Worksheets("Sheet2")
   
'C5セルが空であれば初期値を設定
 If IsEmpty(Ws1.Range("C5").Value) Then
  Ws1.Range("C5").Value = "野菜"
 End If

'Range("C5:C10") のセル範囲に対して、データバリデーションの設定を行います。
'Validation(入力規則)は、セルに適用される条件を定義するものです。
 With Ws1.Range("C5:C10").Validation  '最初に選択するセルの範囲

    '既存のデータバリデーションを削除します。
    'これにより、指定したセル範囲に以前に設定されていたデータバリデーションがクリアされます。
    .Delete

    'データバリデーションを新たに追加します。具体的には、リスト形式のデータバリデーションを設定しています。'
    'Type:=xlValidateList: リスト形式のデータバリデーションを指定します。
    'Formula1:="=Sheet2!$B$3:$D$3": 「Sheet2」に作成したバリデーションの対象範囲のリストを指定します。
    'ここでは、B3からD3までのセル範囲にあるリストを指定しています。
    .Add Type:=xlValidateList, Formula1:="=Sheet2!$B$3:$D$3"  '最初に選択するカテゴリを指定

    '空白セルを無視するように設定します。
    'これにより、データバリデーションが適用されたセルに対して空白のままで保存できるようになります。
    .IgnoreBlank = True

    'セル内にドロップダウンリストを表示するように設定します。
    'これにより、ユーザーがセルをクリックすると、指定されたリストから値を選択できるようになります。
    .InCellDropdown = True

 End With

'シート「Sheet2」を選択
 Ws2.Select

'選択肢一覧表の範囲を指定するためのカウント変数を宣言
 Dim i As Integer
 
'Sheet2の特定の範囲に対して列番号を変数 i を使用してループ
 For i = 2 To 4

    '2行目から下に連続する非空セルの範囲を取得し、Range オブジェクトに設定します。
    '選択肢の表の3行目、i列目のセルの値を名前として付けます。
     Ws2.Range(Cells(4, i), Cells(4, i).End(xlDown)).Name = Ws2.Cells(3, i).Value

 Next

'シート「Sheet1」を選択
 Ws1.Select
  
'シート「Sheet1」のRange("D5:D10") のセル範囲に対して、データバリデーションの設定を行います。
 With Ws1.Range("D5:D10").Validation  '入力値に応じて表示される選択肢のセル範囲
    
    '既存のデータバリデーションを削除します。
    'これにより、指定したセル範囲に以前に設定されていたデータバリデーションがクリアされます。
    .Delete

    '.Add Type:=xlValidateList, Formula1:="=INDIRECT($C5)": データバリデーションを新たに追加します。
    '具体的には、リスト形式のデータバリデーションを設定しています。
    'Type:=xlValidateList: リスト形式のデータバリデーションを指定します。
    'Formula1:="=INDIRECT($C5)": バリデーションの対象範囲のリストを指定します。
    'ここでは、$C5 のセルに記載されているセル参照を使ってリストを指定しています。
    'INDIRECT 関数は、セル参照を使ってセルの内容を取得します。
    .Add Type:=xlValidateList, Formula1:="=INDIRECT($C5)"

 End With
  
End Sub

このコードを使用することで、Excel上で入力値に応じた選択肢を簡単に実現できます。