2009-12-15 8 views
9

Mi piacerebbe avere una matrice di oggetti in Excel che chiama un gestore di eventi. in particolare ho più pulsanti che eseguono la stessa funzione per celle diverse, e per evitare di duplicare il codice vorrei semplicemente fare riferimento a questi oggetti pulsante tramite un indice (come facevo in VB 6.0) .... trovando quale pulsante è stato cliccato Vorrei compilare celle specifiche ecc. quindi la domanda è: una serie di pulsanti in Excel VBA? Ho fatto un po 'di lavoro in VB.net, dove ho usato le collezioni, e questo ha funzionato bene ... ma sembra che non posso farlo in VBA.array di oggetti o raccolta in Excel VBA

risposta

1

Separare il codice comune in un singolo metodo e passare la cella come parametro. Assegna a ciascun pulsante il proprio metodo di evento, che a sua volta chiama il metodo comune con la cella specifica da modificare come parametro. Qualcosa del genere:

Private Sub CommonMethod(someCell as String) 
    ' Do your stuff 
    Range(someCell).Value = something 
End Sub 

Così ogni pulsante può essere assegnato al proprio metodo. Questo è già integrato, quindi non provare a ricrearlo, mantienilo semplice.

Private Sub Button1_Click() 
    CommonMethod("A1"); 
End Sub 

Private Sub Button2_Click() 
    CommonMethod("A2"); 
End Sub 
3

Non ci sono array di controllo in VBA come in VB. Per alcuni controlli è possibile creare una classe personalizzata per gestire gli eventi. Ad esempio, si supponga di avere un userform con due pulsanti di comando. Nel modulo form, inserire questo codice

Private mcolEventButtons As Collection 

Private Sub UserForm_Initialize() 

    Dim clsEventButton As CEventButton 

    Set mcolEventButtons = New Collection 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton1 
    clsEventButton.RangeAddress = "A1" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton1.Name 

    Set clsEventButton = New CEventButton 
    Set clsEventButton.EventButton = Me.CommandButton2 
    clsEventButton.RangeAddress = "A10" 
    mcolEventButtons.Add clsEventButton, Me.CommandButton2.Name 

End Sub 

quindi creare un modulo di classe personalizzata denominata CEventButton e inserire questo codice

Private WithEvents mctlEventButton As MSForms.CommandButton 
Private msRangeAddress As String 

Public Property Set EventButton(ctlButton As MSForms.CommandButton) 

    Set mctlEventButton = ctlButton 

End Property 

Public Property Get EventButton() As MSForms.CommandButton 

    Set EventButton = mctlEventButton 

End Property 

Private Sub mctlEventButton_Click() 

    Sheet1.Range(Me.RangeAddress).Value = "Something" 

End Sub 

Public Property Get RangeAddress() As String 

    RangeAddress = msRangeAddress 

End Property 

Public Property Let RangeAddress(ByVal sRangeAddress As String) 

    msRangeAddress = sRangeAddress 

End Property 

La parola chiave WithEvents nei sondaggi dimensionamento variabile eventi e gli incendi del controllo CommandButton come se era legato a un particolare controllo e al modulo userform.

Ecco cosa hai fatto: hai creato una raccolta per conservare le istanze della tua classe personalizzata per tutto il tempo in cui il modulo utente è attivo. Ciò garantisce che tali istanze rimangano nell'ambito. Quindi hai creato una nuova istanza della classe, assegnandogli un determinato pulsante e salvandola nella raccolta. Hai fatto lo stesso per il prossimo pulsante. In questo esempio ci sono solo due pulsanti, ma se ne avessi di più potresti continuare a farlo fino a esaurire la memoria.

Creo una proprietà RangeAddress nel modulo di classe personalizzato come esempio. Le informazioni che dovrai memorizzare dipendono da ciò che alla fine stai cercando di ottenere.

Per questo esempio, è necessario impostare la proprietà ShowModal del form utente su FALSE, i commandbuttons denominati CommandButton1 e CommandButton2, avere un foglio con un nome in codice di Sheet1 e probabilmente altre cose.