| 
    
     |  | こんにちは。 
 >複数のComboboxを用意した場合、アクティブになっているComboboxのオブジェクトだけを調べる方法ってあるのでしょうか?
 >以下のようにそれぞれフラグを立ててもいいのですが、この方法だとComboboxの数が増えれば増えるほど、ソースが醜くなってしまいます。
 
 クラスモジュールを使用すると可能ですが、コンボボックスの数によって
 従来どおりの記述のほうが簡単かもしれませんよ(10個ぐらいなら考えてもよいかも)
 
 まず、クラスモジュールから
 
 Class1のクラスモジュールに
 
 '================================================
 Event cchange(combo As Object)
 Private cmb As Class2
 Private c_controls As Collection
 '================================================
 Private Sub Class_Initialize()
 Set c_controls = New Collection
 End Sub
 '================================================
 Private Sub Class_Terminate()
 Set c_controls = Nothing
 End Sub
 '================================================
 Sub cmd_change(combo As Object)
 RaiseEvent cchange(combo)
 End Sub
 '================================================
 Sub add(obj1 As Object)
 Set cmb = New Class2
 cmb.set_controls obj1, Me
 c_controls.add cmb
 End Sub
 
 
 Class2のクラスモジュールに
 '================================================
 Private WithEvents cmd As MSForms.ComboBox
 Private pa_obj As Object
 '================================================
 Private Sub cmd_change()
 pa_obj.cmd_change cmd
 End Sub
 '================================================
 Sub set_controls(obj1 As Object, obj2 As Object)
 Set cmd = obj1
 Set pa_obj = obj2
 End Sub
 
 
 で問題のUserform1には、複数のコンボボックスと
 ラベル(Label1)は最低貼り付けておいてください。
 
 そのユーザーフォームのモジュールに
 
 '================================================
 
 Private WithEvents class_cmb As Class1
 '================================================
 Private Sub class_cmb_cchange(combo As Object)
 ’このイベントプロシジャーに一括してコードが書けます
 
 Label1.Caption = "今、" & combo.Name & " を変更したよ"
 End Sub
 '================================================
 Private Sub CommandButton1_Click()
 Dim aaa As Object
 Set aaa = ComboBox1
 MsgBox TypeName(aaa)
 End Sub
 '================================================
 Private Sub UserForm_Initialize()
 Dim cont As Object
 Set class_cmb = New Class1
 With class_cmb
 For Each cont In Controls
 If UCase(TypeName(cont)) = UCase("combobox") Then
 With cont
 .List() = Array("a", "b", "c")
 .ListIndex = 0
 End With
 .add cont
 End If
 Next
 End With
 End Sub
 '================================================
 Private Sub UserForm_Terminate()
 Set class_cmb = Nothing
 End Sub
 
 
 最後に
 標準モジュールに
 '===============================================
 sub main()
 userform1.show
 end sub
 
 として、mainを実行して見てください。
 
 クラスで作成しても結構コードが長くなりますが、
 クラスモジュールは使い回しが出来るので
 場合によっては便利かもしれませんよ!!
 
 試してみてください。
 
 |  |