ExcelのVBA(Visual Basic for Applications)を使って、ユーザーフォームにコンボボックスを設置し、データ入力の効率化や入力ミスの防止を図るケースは非常に多いでしょう。
本記事では、VBAでコンボボックスを実装する基本的な方法から、値の設定・取得・イベント処理・プロパティ設定まで、実際のコード例とともに詳しく解説していきます。
VBA初心者から中級者まで、すぐに実践に活かせる内容となっています。
VBAコンボボックスの基本的な作り方
それではまず、ExcelのVBAでコンボボックスを配置する基本的な手順について解説していきます。
ユーザーフォームへのコンボボックスの配置
VBAでコンボボックスを使う最も一般的な方法は、ユーザーフォームに配置することです。
ユーザーフォームへのコンボボックス配置手順
1. VBAエディター(Alt+F11)を開く
2. 挿入メニュー → ユーザーフォームを選択
3. ツールボックスから「コンボボックス」をフォームにドラッグ配置
4. プロパティウィンドウでNameプロパティを設定(例:cboFruit)
フォームに配置したコンボボックスには、わかりやすい名前(プレフィックスにcboを使う命名規則が一般的)をNameプロパティで設定しておきましょう。
AddItemメソッドで選択肢を追加する
コンボボックスに選択肢を追加するには、AddItemメソッドを使います。
通常、フォームのInitializeイベントで選択肢を設定します。
AddItemによる選択肢の追加(UserForm_Initialize内)
Private Sub UserForm_Initialize()
‘ コンボボックスに選択肢を追加
cboFruit.AddItem “りんご”
cboFruit.AddItem “バナナ”
cboFruit.AddItem “みかん”
cboFruit.AddItem “ぶどう”
‘ デフォルト選択の設定
cboFruit.ListIndex = 0 ‘ 最初の項目を選択
End Sub
Excelのセル範囲から選択肢を設定する
選択肢をマクロにハードコードするより、Excelのセルに入力されたデータをコンボボックスの選択肢として使う方が保守しやすいです。
セル範囲から選択肢を設定する方法
Private Sub UserForm_Initialize()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(“マスターデータ”)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow ‘ 2行目からデータ最終行まで
cboFruit.AddItem ws.Cells(i, 1).Value
Next i
End Sub
または、RowSourceプロパティを使ってセル範囲を直接指定する方法もシンプルです。
コンボボックスの主要プロパティの設定
続いては、VBAコンボボックスのよく使う主要プロパティの設定方法について確認していきましょう。
よく使う主要プロパティ一覧
| プロパティ名 | 説明 | 設定例 |
|---|---|---|
| Name | コントロールの名前 | cboFruit |
| Value | 現在選択されている値 | cboFruit.Value = “りんご” |
| ListIndex | 選択されている項目のインデックス(0始まり) | cboFruit.ListIndex = 0 |
| RowSource | 選択肢として使うセル範囲 | cboFruit.RowSource = “Sheet1!A2:A10” |
| Style | 0=編集可能、2=リストのみ選択可 | cboFruit.Style = 2 |
| Enabled | 有効/無効の切り替え | cboFruit.Enabled = False |
Styleプロパティでコンボボックスとドロップダウンを切り替える
Styleプロパティは、コンボボックスの動作モードを切り替える重要なプロパティです。
fmStyleDropDownCombo(値:0)は編集可能モードで、テキスト入力と選択の両方が可能です。
fmStyleDropDownList(値:2)はリスト選択専用モードで、定義済みの選択肢からのみ選択できます。
入力値の誤りを防ぎたい場合(データの一貫性が重要な場合)は、fmStyleDropDownList(値:2)を使うことが推奨されます。
AutoCompleteとMatchEntryの設定
コンボボックスのMatchEntryプロパティを使うことで、入力した文字列に一致する選択肢への自動移動の動作を設定できます。
fmMatchEntryFirstLetter(値:0)は入力した最初の文字に一致する項目に移動します。
fmMatchEntryComplete(値:1)は入力した文字列全体に一致する最初の項目に移動します。
コンボボックスの値の取得とイベント処理
続いては、コンボボックスで選択された値の取得方法と、主要なイベント処理について確認していきましょう。
選択値の取得方法
コンボボックスで選択された値を取得するには主に2つの方法があります。
選択値の取得方法
‘ 方法1:Valueプロパティ(表示テキストを取得)
Dim selectedFruit As String
selectedFruit = cboFruit.Value
‘ 方法2:ListIndexプロパティ(インデックスを取得)
Dim selectedIndex As Integer
selectedIndex = cboFruit.ListIndex
‘ 選択されていない場合、ListIndexは-1になる
If cboFruit.ListIndex = -1 Then
MsgBox “項目を選択してください”
End If
Changeイベントを使った連動処理
コンボボックスのChangeイベントは、選択内容が変わったときに自動的に実行される処理を定義するのに使います。
Changeイベントの実装例(都道府県選択で市区町村を連動)
Private Sub cboPrefecture_Change()
‘ 市区町村コンボボックスをクリア
cboCity.Clear
‘ 選択された都道府県に応じて市区町村を追加
Select Case cboPrefecture.Value
Case “東京都”
cboCity.AddItem “新宿区”
cboCity.AddItem “渋谷区”
cboCity.AddItem “港区”
Case “大阪府”
cboCity.AddItem “北区”
cboCity.AddItem “中央区”
End Select
End Sub
カスケード(連動)コンボボックスを実現することで、ユーザーの入力ミスを防ぎ、より構造化されたデータ入力フォームを作成できます。
OKボタン処理と入力値の検証
フォームのOKボタン(送信ボタン)処理では、コンボボックスの値を検証してからExcelシートに書き込む処理を実装します。
OKボタン処理の例
Private Sub btnOK_Click()
‘ 入力検証
If cboFruit.ListIndex = -1 Then
MsgBox “果物を選択してください”, vbExclamation
Exit Sub
End If
‘ 選択値をシートに書き込む
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(“データ”)
Dim nextRow As Long
nextRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(nextRow, 1).Value = cboFruit.Value
‘ フォームを閉じる
Unload Me
End Sub
ワークシート上のコンボボックスの活用
続いては、ユーザーフォームではなく、Excelのワークシート上に直接配置するコンボボックスの使い方について確認していきましょう。
ワークシート上へのコンボボックスの配置
Excelのワークシートに直接コンボボックスを配置する方法もあります。
開発タブ → 挿入 → フォームコントロールまたはActiveXコントロールのコンボボックスを選択し、ワークシート上に描画します。
フォームコントロールはVBAによる細かい制御が不要な場合のシンプルな選択肢です。
ActiveXコントロールは、VBAでより細かくイベント処理やプロパティを制御できます。
ActiveXコンボボックスのイベント処理
ワークシート上のActiveXコンボボックスのイベントは、そのワークシートのコードモジュールに記述します。
ワークシート上のActiveXコンボボックスのイベント処理
‘ シートのコードモジュールに記述
Private Sub ComboBox1_Change()
‘ 選択値を隣のセルに表示
Range(“B1”).Value = ComboBox1.Value
End Sub
データの入力規則との使い分け
ワークシートのセルに選択肢を設けたい場合、VBAのActiveXコンボボックスの他に、Excelの標準機能のデータの入力規則(リスト)も有効な選択肢です。
データの入力規則のリストは、VBAなしで設定できる手軽さがあり、指定したセル範囲の値から選択できるドロップダウンを実現できます。
複雑なイベント処理や動的な選択肢の変更が不要であれば、データの入力規則の方がシンプルで保守しやすい場合があります。
まとめ
本記事では、VBAでのコンボボックスの基本的な作り方(ユーザーフォームへの配置・AddItemメソッド・RowSource)、主要プロパティの設定、値の取得・Changeイベント処理、ワークシート上での活用方法について解説しました。
VBAのコンボボックスは、Excelでのデータ入力フォームの効率化と入力ミスの防止に非常に効果的なUI部品です。
Changeイベントを使ったカスケード連動、StyleプロパティによるモードとOKボタンでの入力検証を組み合わせることで、使いやすく堅牢な入力フォームが実現できるでしょう。