HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > 1つ目のコンボボックスの値に応じて2つ目のコンボボックスのリストを変更する

1つ目のコンボボックスの値に応じて2つ目のコンボボックスのリストを変更する|Excel VBA

ユーザーフォーム関連のテクニック

1つ目のコンボボックスの値に応じて2つ目のコンボボックスのリストを変更する

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

ユーザーフォームに配置された2つのコンボボックスうち、一方で選択された値を判断してもう一方のリストの値を設定する方法をご紹介します。

ユーザーフォームが開くときに発生するInitializeイベントで初期値を設定します。
また、基準となるコンボボックスの選択項目を変更したときに発生するChangeイベントで、
もう1つのコンボボックスのリストを設定します。

次のサンプルでは、1つ目のコンボボックス「ComboBox1」のリストに月名を表示し、選択された月に応じて、その月の日にちをもう1つのコンボボックス「ComboBox2」に設定します。
ユーザーフォーム表示時は、現在の月日を設定しています。(ただし、閏年には対応していません)

ユーザーフォームに2つのコンボボックス「ComboBox1」「ComboBox2」を配置し、フォームモジュールに次のコードを記述してください。

Option Explicit

'月別の日数を格納する配列
Private m_ArrayMonth(1 To 12)  As Integer

'========= ユーザーフォーム初期化処理 ==============
Private Sub UserForm_Initialize()
    Dim m As Integer

    '月別の日数を配列m_ArrayMonthに設定
    For m = 1 To 12
        Select Case m
            Case 2                  '2月
                m_ArrayMonth(m) = 28
            Case 4, 6, 9, 11        '30日の月
                m_ArrayMonth(m) = 30
            Case Else               '31日の月
                m_ArrayMonth(m) = 31
        End Select
    Next m
    
    '[月]コンボボックスの表示処理
    With ComboBox1
        '1月〜12月までをリストに設定
        For m = 1 To 12
            .AddItem CStr(m) & "月"
        Next m
        
        '[月]コンボボックスを現在の月に設定
        .Value = CStr(Month(Now)) & "月"    '---(1)
    End With
            
    '[日]コンボボックスを現在の日に設定
    ComboBox2.Value = CStr(day(Now)) & "日"
End Sub
'=========[月]コンボボックス変更時の処理 =========
Private Sub ComboBox1_Change()
    Dim m As Integer
    Dim d As Integer

    '[月]コンボボックスで選択された月を取得
    m = ComboBox1.ListIndex + 1

    '[日]コンボボックスをいったんクリア
    ComboBox2.Clear

    '[日]コンボボックスに日にちのリストを設定
    With ComboBox2
        For d = 1 To m_ArrayMonth(m)
            .AddItem CStr(d) & "日"
        Next d
        
        '1日を選択
        .Value = "1日"
    End With
End Sub

●補足●

ユーザーフォームのInitializeイベントプロシージャの(1)で[月]コンボボックスに初期値を設定すると、ComboBox1のChangeイベントが発生します。
[日]コンボボックスには(1)で設定した現在の月に応じた日にちのリストが設定されます。