2013-03-20 8 views
7

Ho un migliaio di celle in un foglio di lavoro Excel che sono ComboBox. L'utente ne selezionerà uno a caso e lo popolerà.VBA - Ottieni il valore selezionato di una casella combinata

Come si ottiene il valore del ComboBox selezionato? C'è un modo per attivare una funzione (cioè un gestore di eventi) quando i ComboxBox sono stati selezionati?

+1

fai significa che devi opzione 'convalida' in quelle cellule ?? non una vera casella combinata che è un oggetto forma/forma ... –

+1

@KazJaw questa domanda ha davvero bisogno di chiarimenti :) Se l'OP ha "migliaia" di caselle combinate, avrà bisogno di migliaia di gestori di eventi. Altrimenti, se sono solo un'opzione di validazione, un gestore 'Worksheet_Change' farà il trucco. –

+0

@DavidZemens, dopo tutto ... hai ragione :) Quindi, penso che ci sia già una risposta per la domanda nel tuo commento e sotto (da @ user20623626) –

risposta

6

Se si ha a che fare con gli elenchi di convalida dei dati, è possibile utilizzare l'evento Worksheet_Change. Fare clic con il tasto destro sul foglio con la convalida dei dati e selezionare Visualizza codice. Digita qui:

Private Sub Worksheet_Change(ByVal Target As Range) 

    MsgBox Target.Value 

End Sub 

Se hai a che fare con le combobox ActiveX, è un po 'più complicato. È necessario creare un modulo di classe personalizzato per collegare gli eventi. Per prima cosa, crea un modulo di classe chiamato CComboEvent e inserisci questo codice.

Public WithEvents Cbx As MSForms.ComboBox 

Private Sub Cbx_Change() 

    MsgBox Cbx.Value 

End Sub 

Successivamente, creare un altro modulo di classe denominato CComboEvents. Ciò manterrà tutte le nostre istanze CComboEvent e le manterrà nell'ambito. Inserisci questo codice in 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 

Infine, creare un modulo standard (non un modulo di classe). Avrai bisogno del codice per mettere tutte le tue combo box nei moduli di classe. Si potrebbe mettere questo in una procedura Auto_apri in modo che accada ogni volta che la cartella di lavoro viene aperta, ma dipende da voi.

Avrete bisogno di una variabile pubblica per contenere un'istanza di CComboEvents. Rendendolo pubblico lo faranno, e tutti i suoi figli, in ambito. Ne hai bisogno per far sì che gli eventi vengano attivati. Nella procedura, passa in rassegna tutte le caselle combinate, creando una nuova istanza CComboEvent per ognuna e aggiungendola a 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 

Ora, ogni volta che un combobox viene modificato, l'evento si attiverà e, in questo esempio, una finestra di messaggio verrà visualizzato.

Si può vedere un esempio a https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm

4

È possibile utilizzare l'evento di modifica sottostante a cui verrà attivato quando il valore della casella combinata cambierà.

Private Sub ComboBox1_Change() 
'your code here 
End Sub 

Inoltre è possibile ottenere il valore selezionato utilizzando sotto

ComboBox1.Value 
+1

Sicuramente questo funzionerà, ma se OP ha davvero "migliaia" di combobox sul foglio di lavoro, avranno bisogno di migliaia di subroutine corrispondenti; 1 per ogni casella combinata. –

+0

Non ho migliaia di combobox, solo 1, e sono molto obbligato per l'esempio. – YetAnotherRandomUser

-1

Forse sarete in grado di impostare i gestori di eventi a livello di codice, utilizzando qualcosa di simile (pseudocodice)

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

for each cell 
    cell.setEventHandler(myHandler) 

Ma Non conosco la sintassi per raggiungere questo in VB/VBA, o se è anche possibile.