ComboBoxes である Excel ワークシートに何千ものセルがあります。ユーザーはランダムに 1 つを選択して入力します。
選択した ComboBox 値を取得するにはどうすればよいですか? ComboxBoxes が選択されたときに関数 (つまり、イベント ハンドラー) をトリガーする方法はありますか?
コンボボックスの値が変更されたときにトリガーされる以下の変更イベントを使用できます。
Private Sub ComboBox1_Change()
'your code here
End Sub
また、以下を使用して選択した値を取得できます
ComboBox1.Value
データ検証リストを扱っている場合は、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 のインスタンスを保持するには、Public 変数が必要です。パブリックにすることで、それとそのすべての子がスコープ内に保持されます。イベントがトリガーされるように、スコープ内でそれらが必要です。この手順では、すべてのコンボボックスをループして、それぞれに新しい 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で例を確認できます。
ComboBox コントロールから選択した値を取得する簡単な方法は次のとおりです。
Private Sub myComboBox_Change()
msgbox "You selected: " + myComboBox.SelText
End Sub
たぶん、(疑似コード)のようなものを使用して、プログラムでイベントハンドラーを設定できるでしょう
sub myhandler(eventsource)
process(eventsource.value)
end sub
for each cell
cell.setEventHandler(myHandler)
しかし、VB/VBA でこれを達成するための構文がわかりません。