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
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
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.