フォームに配置された2つのコンボボックスうち、一方で選択された値を
判断してもう一方のリストの値を設定するには、まずは初期値の設定を
フォームが開かれる時に発生するイベント「Initialize」で行い、
基準となるコンボボックス内で選択項目を変更するときに発生するイベント
「Change」でもう1つのコンボボックスのリストの値を設定します。
サンプルマクロでは、1つ目のコンボボックス「ComboBox1」のリストに
月名をセットして、選択された月の日にちをもう1つのコンボボックス
「ComboBox2」のリストにセットしています。
フォームに2つのコンボボックス「ComboBox1」「ComboBox2」を配置して
次のイベントプロシージャを作成してください。
Private Sub UserForm_Initialize()
'月をカウントする変数の宣言
Dim mnt As Byte
'日をカウントする変数の宣言
Dim dy As Byte
'「日」にAddItemするためのループカウンター用変数の宣言
Dim i As Byte
'「月」コンボボックス表示処理
'ComboBox1に月を列挙( 0〜11までの12個の要素 )
For mnt = 0 To 11
'「1月」「2月」という形式でリストに追加する
ComboBox1.AddItem mnt + 1 & "月"
Next
'「月」コンボボックスの初期表示設定
'現在の月を表示
ComboBox1.Text = Month(Now) & "月"
'「日」コンボボックス表示処理
'現在の月によって表示する日数を確定する
'プログラム上は 0からなので実日数より 1少ない
Select Case Month(Now)
Case 2 '2月
dy = 27
Case 4, 6, 9, 11 '30日の月
dy = 29
Case Else '31日の月
dy = 30
End Select
'ComboBox1に該当月の日を列挙
For i = 0 To dy
'「1日」「2日」という形式でリストに追加する
'[注意!]日付の書き出しは今までの dyではなくて
'iを使っています
ComboBox2.AddItem i + 1 & "日"
Next
'現在の日を表示
ComboBox2.Text = Day(Now) & "日"
End Sub
Private Sub ComboBox1_Change()
'コンボボックスで選択された月を格納する変数
Dim mnt As Byte
'該当月の日数を格納する変数
Dim dy As Byte
'日にちを加算する際の「何日」という文字列を格納する変数
Dim AI As String
'削除するインデックス位置を格納する変数
Dim i As Byte
'「月」コンボボックスで選択された月を取得
'ListIndexは 0からだから、1を足すと月度になる
mnt = ComboBox1.ListIndex + 1
'該当月の日数を計算
Select Case mnt
Case 2
dy = 28
Case 4, 6, 9, 11
dy = 30
Case Else
dy = 31
End Select
'選択された月のほうが現在よりも日数が少ないとき
If dy < ComboBox2.ListCount Then
'「日」コンボボックスのアイテム数がその月の日数と
'一致するまで繰り返す
Do Until dy = ComboBox2.ListCount
'削除するアイテムの位置を計算する
'ListCountは 1から ListIndexは 0からだから -1
i = ComboBox2.ListCount - 1
'計算された最後の項目を削除する
ComboBox2.RemoveItem (i)
Loop
'2月31日等の表示を避けるために1日にしてしまう
ComboBox2.Text = "1日"
End If
'選択された月のほうが現在よりも日数が多いとき
'[注意!]起動時にこの処理をしないように「月」コンボボックスに
'何かデータが入っていることも条件にする
If dy > ComboBox2.ListCount And ComboBox2.Text <> "" Then
'「日」コンボボックスのアイテム数がその月の日数と
'一致するまで繰り返す
Do Until dy = ComboBox2.ListCount
'リストの最後に加算する日付を作る
'現在のリスト数+1日
AI = ComboBox2.ListCount + 1 & "日"
'リストの最後に計算された日付を追加する
ComboBox2.AddItem AI
Loop
'2月31日等の表示を避けるために1日にしてしまう
ComboBox2.Text = "1日"
End If
End Sub
但し、閏年には対応していません。
|