web-dev-qa-db-ja.com

VBA-コンボボックスの選択値を取得

ExcelワークシートにはComboBoxである何千ものセルがあります。ユーザーはランダムに1つを選択し、それを設定します。

選択したComboBox値を取得するにはどうすればよいですか? ComboxBoxesが選択されているときに関数(イベントハンドラー)をトリガーする方法はありますか?

8
user559142

データ検証リストを扱っている場合は、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 で例を見ることができます

7
Dick Kusleika

以下の変更イベントを使用すると、コンボボックスの値が変更されたときにトリガーされます。

Private Sub ComboBox1_Change()
'your code here
End Sub

また、以下を使用して選択した値を取得できます

ComboBox1.Value
7
user2063626