2013-03-20 30 views
7

コンボボックスであるExcelワークシートに何千ものセルがあります。ユーザーはランダムに選択して入力します。VBA - Comboboxの選択値を取得

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

+1

で例を見ることができます?シェイプ/フォームオブジェクトである実際のコンボボックスではありません。 –

+1

@KazJawこの質問は本当に解明が必要です:) OPには何千ものコンボボックスがあると、何千ものイベントハンドラが必要になります。さもなければ、それらが単に検証オプションであるならば、 'Worksheet_Change'ハンドラがそのトリックを行います。 –

+0

@DavidZemens、結局のところ...あなたは正しいです:)だから、私はあなたのコメントと以下(@ user20623626)の質問にはすでに回答があると思います –

答えて

6

データ検証リストを扱う場合は、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

4

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

Private Sub ComboBox1_Change() 
'your code here 
End Sub 

また、あなたが

ComboBox1.Value 
+1

これは間違いなく動作しますが、OPに実際に "千"ワークシート上のコンボボックスの数は、対応する何千ものサブルーチンを必要とします。各コンボボックスごとに1つ。 –

+0

私は何千ものコンボボックスを持っていません。ちょうど1であり、私はこの例のために非常に義務付けられています。 – YetAnotherRandomUser

-1

の下に使用して、選択した値が、たぶん、あなたは(擬似コード)のようなものを使用して、プログラムでイベントハンドラを設定することができます得ることができます

sub myhandler(eventsource) 
    process(eventsource.value) 
end sub 

for each cell 
    cell.setEventHandler(myHandler) 

しかし、私はVB/VBAでこれを達成するための構文を知っていないか、あるいは可能でもあります。

関連する問題