コンボボックスであるExcelワークシートに何千ものセルがあります。ユーザーはランダムに選択して入力します。VBA - Comboboxの選択値を取得
選択したComboBoxの値を取得するにはどうすればよいですか? ComboxBoxesが選択されているときに関数(つまりイベントハンドラ)をトリガする方法はありますか?
コンボボックスであるExcelワークシートに何千ものセルがあります。ユーザーはランダムに選択して入力します。VBA - Comboboxの選択値を取得
選択した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
これは間違いなく動作しますが、OPに実際に "千"ワークシート上のコンボボックスの数は、対応する何千ものサブルーチンを必要とします。各コンボボックスごとに1つ。 –
私は何千ものコンボボックスを持っていません。ちょうど1であり、私はこの例のために非常に義務付けられています。 – YetAnotherRandomUser
の下に使用して、選択した値が、たぶん、あなたは(擬似コード)のようなものを使用して、プログラムでイベントハンドラを設定することができます得ることができます
sub myhandler(eventsource)
process(eventsource.value)
end sub
for each cell
cell.setEventHandler(myHandler)
しかし、私はVB/VBAでこれを達成するための構文を知っていないか、あるいは可能でもあります。
で例を見ることができます?シェイプ/フォームオブジェクトである実際のコンボボックスではありません。 –
@KazJawこの質問は本当に解明が必要です:) OPには何千ものコンボボックスがあると、何千ものイベントハンドラが必要になります。さもなければ、それらが単に検証オプションであるならば、 'Worksheet_Change'ハンドラがそのトリックを行います。 –
@DavidZemens、結局のところ...あなたは正しいです:)だから、私はあなたのコメントと以下(@ user20623626)の質問にはすでに回答があると思います –