コンボボックスどこでもプルダウン

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キー
を押すか、余白でマウスをクリックしてください。
そうすると、リストが閉じます。

この記事が気に入ったらサポートをしてみませんか?