2013-03-22 26 views
8

Ho 4+ ComboBox su un modulo utente. Quando sparano, sparano lo stesso evento. Quello che sto cercando di fare è scoprire quale ComboBox ha attivato l'evento. I ComboBox sono creati in base a quanti componenti ci sono. Il codice che genera il ComboBoxes è la seguente:Identificazione di ComboBox VBA di Excel

For j = 0 To UBound(ComponentList) - 1 
'Set Label 
num = j + 1 
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True) 
With control 
    .Caption = "Component " & CStr(num) 
    .Left = 30 
    .Top = Height 
    .Height = 20 
    .Width = 100 
    .Visible = True 
End With 
'set ComboBox 
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True) 
With combo 
    .List = ComponentList() 
    .Left = 150 
    .Top = Height 
    .Height = 20 
    .Width = 50 
    .Visible = True 
    Set cButton = New clsButton 
    Set cButton.combobox = combo 
    coll.Add cButton 
End With 
Height = Height + 30 
Next j 

Questo funziona bene e posso ottenere il valore selezionato dall'utente, ma non riesco a trovare quale ComboBox è stato utilizzato. Questo codice qui sotto è l'evento che spara (clsButton):

Public WithEvents btn As MSForms.CommandButton 
Public WithEvents combobox As MSForms.combobox 
Private combolist() As String 

Private Sub btn_Click() 
    If btn.Caption = "Cancel" Then 
     MsgBox "Cancel" 
     Unload UserForm1 
     Variables.ComponentSelectionError = False 
    ElseIf btn.Caption = "Enter" Then 
     MsgBox "enter" 
     Unload UserForm1 
     Variables.ComponentSelectionError = True 
    End If 
End Sub 

Private Sub combobox_Click() 
    MsgBox combobox.Value 
End Sub 

Questo bit di codice di cui sopra è stato gentilmente lavorato da Doug Glancy per ottenere gli eventi che lavorano con il codice generato ComboBoxes.

Come si ottiene il ComboBox che ha attivato l'evento? cioè il nome o qualche altra forma di identificazione.

risposta

4

All'interno della classe .Name non comparirà nella lista intellisense per la casella combinata come MSForms.ComboBox in realtà non hanno una proprietà nome stesso (dare un'occhiata a esso nel browser oggetto F2), piuttosto che la proprietà è fornito dalla classe Control di base:

Private Sub combobox_Click() 

    MsgBox combobox.Value 
    MsgBox combobox.Name '// no hint but still works 

    '//cast to a Control to get the formal control interface with .Name 
    Dim ctrl As Control: Set ctrl = combobox 
    MsgBox ctrl.Name 

End Sub 
+0

Grazie a questo ha funzionato, ho anche trovato una soluzione dopo ore di ricerca e ora sto combinando entrambi. Grazie per l'aiuto! – NoLiver92

2

Forse si fa nuovamente riferimento a btn.Combobox? Simile a come è stato assegnato il combobox al pulsante in primo luogo, ma poi in senso inverso:

set combobox = btn.Combobox 
+0

Non sono sicuro da dove vieni con questo. ma quando faccio combobox.whatever non c'è alcuna opzione per il nome o qualsiasi tipo di id quindi non sono sicuro di come farlo. ho guardato oltre 100 webstes che mi dicono come aggiungere e impostare valori ma non come scoprire quale box ha attivato l'evento – NoLiver92

+0

Ah, il tuo post originale non ha detto che volevi il (Nome), solo che volevi " ottenere la casella combinata ", ho quindi pensato che volevi conoscere l'oggetto, non che volevi il nome dell'oggetto ... Grazie per chiarire –

+1

ok modifica il post principale – NoLiver92

5

sono riuscito a rispondere finalmente alla mia domanda dopo la ricerca oltre 500 pagine web (ha preso un lungo orario)

questo è quello che ho usato e funziona e gli incendi quando le alcune caselle combinate sono cliccato:

Private Sub combobox_Click() 
MsgBox combobox.Value 
If combobox = UserForm1.Controls("Component0") Then 
    MsgBox "Success1" 
End If 
If combobox = UserForm1.Controls("Component1") Then 
    MsgBox "Success2" 
End If 
End Sub 

spero che questo può essere utilizzato per altre persone che ne hanno bisogno.

0

C'è un motivo per cui non si aggiunge solo una proprietà alla classe personalizzata e si imposta tale proprietà quando ci si registra nella raccolta?

For j = 0 To UBound(ComponentList) - 1 
'Set Label 
num = j + 1 
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True) 
With control 
    .Caption = "Component " & CStr(num) 
    .Left = 30 
    .Top = Height 
    .Height = 20 
    .Width = 100 
    .Visible = True 
End With 
'set ComboBox 
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True) 
With combo 
    .List = ComponentList() 
    .Left = 150 
    .Top = Height 
    .Height = 20 
    .Width = 50 
    .Visible = True 
    Set cButton = New clsButton 
'*******EDIT******** 
    with cButton 
     .combobox = combo 
     .Indx = j 
    end With 'cButton 
'******************* 
    coll.Add cButton 
End With 
Height = Height + 30 
Next j 

modulo di classe

Public WithEvents btn As MSForms.CommandButton 
Dim WithEvents mCombobox As MSForms.comboBox 
Private combolist() As String 

'*******EDIT******** 
Public Indx As Long 

Property Let comboBox(cb As MSForms.comboBox) 
    Set mCombobox = cb 
End Property 
'******************* 

Private Sub btn_Click() 
    If btn.Caption = "Cancel" Then 
     MsgBox "Cancel" 
     Unload UserForm1 
     Variables.ComponentSelectionError = False 
    ElseIf btn.Caption = "Enter" Then 
     MsgBox "enter" 
     Unload UserForm1 
     Variables.ComponentSelectionError = True 
    End If 
End Sub 

Private Sub mCombobox_Click() 

'*******EDIT******** 
    MsgBox "Combobox " & Indx & Chr(9) & mComboBox.Value 
'******************* 

End Sub 

Dal momento che si richiede molti a uno mappatura degli eventi, suppongo si dispone di un call-back comuni nel codice attuale, così si potrebbe anche fare questo ...

in un modulo standard

Public Sub cbCallBack(ocb As clsButton) 
    MsgBox ocb.Indx 
End Sub 

In clsButton (sostituendo il gestore di eventi)

Private Sub mCombobox_Click() 
    cbCallBack Me 
End Sub