ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA コンボボックスでユーザーに直接入力させない|ユーザーフォームの使い方

VBAのユーザーフォームで使えるコントロールのひとつ、コンボボックスの使い方を解説します。この記事は非エンジニアの会社員でVBAで自動化ツールを開発している人を読者に想定しています。

目次

コンボボックスの使い方

まずはコンボボックスとは何かを見て行きましょう

コンボボックスとは

コンボボックスとは、プルダウンリストのように選択肢の中からユーザーに値を選択してもらうためのコントロールです。プルダウンリストとの違いは、ユーザーが直接入力する事ができる点です。そのため、ユーザーに選択肢に存在していない値を入力されたくない場合は、プログラム側でそれを防ぐ工夫が必要です。

この記事のサンプルでは、売上集計作業で売上高を求める作業を想定します。ユーザーにコンボボックスから売上集計をする販売地域を選択してもらうイメージです。営業所が存在しない地域を選択して欲しくない、と言う前提で、コンボボックスへの直接入力を防止する方法も解説します。

コンボボックスを実装する

早速コンボボックスを実装します。ツールボックスからコンボボックスを選択してユーザーフォーム上に設置します。ツールボックスが表示されていない場合は表示、ツールボックスで表示させる事ができます。

プルダウンリストのような見た目のコントロールがコンボボックス
コンボボックスを選択する

ついでに実行ボタンを設置しておきます。


コンボボックスと実行ボタンを実装したところ
コンボボックスと実行ボタンを実装したところ

いつものように分かりやすいオブジェクト名に変更できます。表示⇒プロパティウィンドウでプロパティウィンドウを表示し、オブジェクト名を変更します。サンプルでは下記の様にオブジェクト名を設定しました。

  • コンボボックス ⇒ 販売地域cbx
  • 実行ボタン ⇒ 実行btn

これでユーザーフォームの設計が完了しました。

フォームモジュールにイベントプロシジャ記述する

◆ Initializeイベントで選択肢を作成する
設計が完了したので、フォームモジュールにイベントプロシジャを記述します。

エディタのプルダウンリストからUserFormのInitializeイベントプロシジャを選択します。

プルダウンリストからUserFormのInitializeイベントを選択する
Initializeイベントのプロシジャを挿入する

InitializeイベントはUserFormが表示されたときにまず実行されるイベントです。Initializeイベントを利用してコンボボックスに選択肢を作成します。

’これはフォームモジュールに記述します

Private Sub UserForm_Initialize()

    販売地域cbx.AddItem "札幌"
    販売地域cbx.AddItem "東京"
    販売地域cbx.AddItem "名古屋"
    販売地域cbx.AddItem "大阪"
    販売地域cbx.AddItem "福岡"
    
End Sub

コンボボックスのAddItemメソッドは引数の文字列をコンボボックスの選択肢に追加します。今回は全ての選択肢をベタ打ちしていますが、選択肢が多い場合はどこかのワークシートに選択肢の一覧表をつくっておいて、For~Next文のループで選択肢を作るのが良いでしょう。

コンボボックスの下向き三角を押したところ
無事にコンボボックスが実装できた

コンボボックスの右端の下向き三角を押すと選択肢が表示されました。コンボボックスの完成です。

ユーザーによるコンボボックスへの選択肢以外の直接入力を認めない

冒頭で説明した通り、コンボボックスはユーザーが直接自由に記入することが可能です。存在しない販売地域を手で入力されると、その後のプロシジャでエラーが出ることが考えられるため、選択肢以外の入力を認めない様にしておきましょう。

コンボボックスの値が入力された瞬間に選択肢以外の文字が入力されたら修正を促すイベントプロシジャを挿入します。

Changeイベントはコンボボックスの値が変更された事がトリガーのイベント
Changeイベントを選択する

ComboBoxのChangeイベントはコンボボックスの値が変更された事がトリガーのイベントです。

Private Sub 販売地域cbx_Change()
    
    If 販売地域cbx.Value <> "札幌" And _
       販売地域cbx.Value <> "東京" And _
       販売地域cbx.Value <> "名古屋" And _
       販売地域cbx.Value <> "大阪" And _
       販売地域cbx.Value <> "福岡" And _
       販売地域cbx.Value <> "" Then '・・・A
       
            MsgBox "入力値が誤っています。"

            販売地域cbx.Value = ""  '・・・B
            販売地域cbx.SetFocus '・・・C
           
    End If
    
End Sub

プログラムのA~Cの部分についてそれぞれ解説します。

  • A:If~End Ifステートメントの条件

選択肢以外の値を認めないための条件を記述します。選択肢のいずれの文字列とも一致しない場合に実行するようにしています。ポイントは空白を許していないことです。

今回は、コンボボックスの選択肢以外の文字が入力された時に、選択肢からの入力を促すと共に、誤入力の文字をクリアします。ユーザーが再入力しやすいようにです。ComboBoxのChangeプロシジャはComboBoxのValueプロパティ(=表示されている値)が変更になったことをトリガーとしているため、誤入力の文字をクリアした瞬間に再びChangeプロシジャが実行され、2度「入力値が誤っています。」とメッセージが表示されてしまいます。それを防ぐ為に、空白への変更時には実行しないようにしています。

  • B:販売地域cbx.Value = ""

ユーザーが再度入力しやすいように空白に戻しています。選択肢からマウスでクリックする事を想定しているので、必須ではありません。

  • C:販売地域cbx.SetFocus '

ユーザーが再度入力しやすいようにコンボボックスを選択した状態にしています。こちらもBと同じで、必須ではありません。


あとは、実行ボタンが表示された時のプロシジャを記述すればユーザーフォームの完成です。

Private Sub 実行btn_Click()

    MsgBox 販売地域cbx.Value & "が選択されました"
    
End Sub

ユーザーフォームを表示させるプロシジャも標準モジュールに作成しておきましょう。

コンボボックスから選択肢を選択して実行ボタンを押したところ
実行結果

コンボボックスの使い方まとめ

  • コンボボックスは選択肢から選択してもらうことを想定したコントロールである
  • ユーザーが直接入力する事もできる
  • 選択肢はInitializeイベントでユーザーフォームが表示された時などに生成する方法がある*1
  • 直接入力を許さないための記述はプログラムの中に記述する

コントロールを上手に使ってユーザーに優しいユーザーインターフェースを目指しましょう。

<関連記事>

*1:ユーザーの操作に応じて選択肢が変わるような場合も考えられます。例:ひとつ目のコンボボックスから「関西」を選択すると、2つめのコンボボックスの選択肢は大阪と京都になる、など