コンボボックスどこでもプルダウン
ExcelVBAのユーザーフォームに作成したコンボボックスを、
右端のドロップボタン以外の場所をクリックした時でも開く
ようにする方法を紹介します。
フォームの中に、コンボボックスが1つ2つだったら、それ
を制御するコードを、フォームモジュールの中に直接書いて
しまえば、それで済むことです。
ですが、10個とか20個となってくると、
同じコードばかり書いていられない上、
①コードが長くなる
②コントロール数が変わるたびにコーディング
③タイプミスしそう
といったデメリットもあります。
そこで、クラスモジュールを使う方法を紹介します。
※クラスを使うときは、個人用マクロブックには書けません。
クラスモジュールに、以下のように書きます。
※クラスモジュール名は「Class1」のままでOKです。
Private WithEvents Target As MSForms.ComboBox
Public Sub SetCtrl(new_ctrl As MSForms.ComboBox)
Set Target = new_ctrl
End Sub
Private Sub Target_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Target.DropDown
End Sub
次に、フォームモジュールの先頭に、以下の一文を加えます。
Private cmbCol As Collection
続いて、フォームのイニシャライズイベントに、以下のように書きます。
Private Sub UserForm_Initialize()
Set cmbCol = New Collection
Dim ctrl As Control, obj As Class1
For Each ctrl In Me.Controls
If TypeName(ctrl) = "ComboBox" Then
Set obj = New Class1
obj.SetCtrl ctrl
cmbCol.Add obj
Set obj = Nothing
End If
Next
End Sub
ひとつ注意する点は、何も選択せずにプルダウンを閉じたい場合、
ドロップボタンを押してもコンボボックスが閉じないので、Escキー
を押すか、余白でマウスをクリックしてください。
そうすると、リストが閉じます。