なぜこの設定が重要なのか
業務システムでユーザーフォームを作成する際、コンボボックスを活用することは非常に多いです。しかし、ユーザーが自由に値を入力できる状態にしておくと、全角・半角の混在や入力ミスによるデータ不整合が発生しやすくなります。
「リスト内の値しか選べないようにする」という制限を設けることは、データのクレンジングの手間を省き、システム運用の安定性を高めるために非常に重要なテクニックです。
Styleプロパティの基礎知識
VBAのユーザーフォームにおけるComboBoxには、入力の柔軟性を制御する「Styleプロパティ」があります。主な設定値は以下の2つです。
fmStyleDropDownCombo (値: 0)
デフォルトの設定です。リストからの選択に加えて、ユーザーが直接テキストボックスのように値を入力することも可能です。
fmStyleDropDownList (値: 2)
リストからの選択のみを許可します。ユーザーは直接文字を入力することができず、用意された選択肢以外は選べないようになります。誤入力を防ぐにはこの設定が最も確実です。
実装のポイント
Styleプロパティは、VBAコードで動的に設定することも可能ですが、設計時にプロパティウィンドウで設定しておくのが最も簡単で確実です。開発時にプロパティウィンドウで「Style」を探し、「2 – fmStyleDropDownList」を選択するだけで完了します。
もしマクロの実行状況に応じて切り替えたい場合は、以下のようなコードを実装してください。
サンプルプログラム
以下のコードを標準モジュールではなく、ユーザーフォームのモジュールに貼り付けて動作を確認してください。
Private Sub UserForm_Initialize()
‘ リストに表示するデータ
Dim cmbData As Variant
cmbData = Array(“東京支店”, “大阪支店”, “名古屋支店”, “福岡支店”)
‘ コンボボックスの設定
With Me.ComboBox1
.List = cmbData
‘ Styleプロパティを「リスト選択のみ」に設定
.Style = fmStyleDropDownList
‘ 初期値としてリストの1番目を表示
.ListIndex = 0
End With
End Sub
‘ 確定ボタン押下時の処理
Private Sub CommandButton1_Click()
‘ 選択内容をチェック
If Me.ComboBox1.ListIndex = -1 Then
MsgBox “支店を選択してください。”, vbExclamation
Exit Sub
End If
MsgBox “選択された支店は:” & Me.ComboBox1.Value
End Sub
応用・注意点
MatchRequired プロパティとの違い
Styleプロパティを「0」にしたまま、リスト外の入力を禁止したい場合に「MatchRequired」プロパティを「True」にすることがあります。しかし、これを使うとリストにない値を入力した際にエラーメッセージが表示されるため、ユーザー体験としてはあまり良くありません。
基本的には、リストから選ばせたいのであれば、最初からStyleプロパティを「2」にするのが最もスマートな解決策です。
また、リストを動的に変更したい場合は、.Clearメソッドで一度中身を消去してから、再度.AddItemや.Listプロパティでデータを投入するようにしてください。これにより、常に最新のマスターデータに基づいた選択肢をユーザーに提示できます。
