ExcelワークシートにはComboBoxである何千ものセルがあります。ユーザーはランダムに1つを選択し、それを設定します。
選択したComboBox値を取得するにはどうすればよいですか? ComboxBoxesが選択されているときに関数(イベントハンドラー)をトリガーする方法はありますか?
データ検証リストを扱っている場合は、Worksheet_Changeイベントを使用できます。データ検証のあるシートを右クリックし、コードの表示を選択します。次に、これを入力します。
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Value
End Sub
ActiveXコンボボックスを扱っている場合は、もう少し複雑です。イベントをフックするには、カスタムクラスモジュールを作成する必要があります。最初に、CComboEventという名前のクラスモジュールを作成し、このコードをそこに配置します。
Public WithEvents Cbx As MSForms.ComboBox
Private Sub Cbx_Change()
MsgBox Cbx.Value
End Sub
次に、CComboEventsという名前の別のクラスモジュールを作成します。これにより、すべてのCComboEventインスタンスが保持され、スコープ内に保持されます。このコードをCComboEventsに入れます。
Private mcolComboEvents As Collection
Private Sub Class_Initialize()
Set mcolComboEvents = New Collection
End Sub
Private Sub Class_Terminate()
Set mcolComboEvents = Nothing
End Sub
Public Sub Add(clsComboEvent As CComboEvent)
mcolComboEvents.Add clsComboEvent, clsComboEvent.Cbx.Name
End Sub
最後に、標準モジュール(クラスモジュールではない)を作成します。すべてのコンボボックスをクラスモジュールに入れるためのコードが必要になります。これをAuto_Openプロシージャに入れて、ブックが開かれるたびに実行されるようにすることもできますが、それはユーザー次第です。
CComboEventsのインスタンスを保持するには、パブリック変数が必要です。パブリックにすることで、それとそのすべての子がスコープ内でケップされます。イベントがトリガーされるように、スコープ内でそれらが必要です。手順では、すべてのコンボボックスをループし、各コンボボックスに対して新しいCComboEventインスタンスを作成し、それをCComboEventsに追加します。
Public gclsComboEvents As CComboEvents
Public Sub AddCombox()
Dim oleo As OLEObject
Dim clsComboEvent As CComboEvent
Set gclsComboEvents = New CComboEvents
For Each oleo In Sheet1.OLEObjects
If TypeName(oleo.Object) = "ComboBox" Then
Set clsComboEvent = New CComboEvent
Set clsComboEvent.Cbx = oleo.Object
gclsComboEvents.Add clsComboEvent
End If
Next oleo
End Sub
これで、コンボボックスが変更されるたびにイベントが発生し、この例ではメッセージボックスが表示されます。
https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm で例を見ることができます
以下の変更イベントを使用すると、コンボボックスの値が変更されたときにトリガーされます。
Private Sub ComboBox1_Change()
'your code here
End Sub
また、以下を使用して選択した値を取得できます
ComboBox1.Value