Post by RE.MOTOBuongiorno Casanmaner. Intanto grazie. A "pelle" capisco che la procedura è molto interessante e mi apre a nuove idee. Confesso però che non è per me di facile implementazione ed è pure la prima volta che mi trovo ad usare i moduli classe. Detto questo, vediamo se ho compreso bene cosa fare.
1) un semplice modulo dove scrive la parte operativa del codice che valuta quale tasto (numero di tasto è stato premuto e la relativa azione da compiere)
2) Questo Workbook
3) Modulo classe.
Il punto 3) crea e processa un messaggio che mette a disposizione per il Modulo Standard. Cosa mette a disposizione: il nome del pulsante azionato. E' cosi? Ho compreso bene?
Qui invece la routine dovrebbe fare in modo di capire quale pulsante è stato azionato e di conseguenza con il ciclo strutturato For Each consentire di visualizzare il foglio richiesto attraverso l'azione sul pulsante. Ho compreso bene?
:)) Io la soprannomino Questo Workbook, lo trovo più sbrigativo e di mediazione ... Purtroppo non ho compreso il ruolo di questa parte di codice. Quindi non è il modulo di classe1 che invia il messaggio ma Questo Workbook
Post by casanmanerA questo punto puoi associare alla tua procedura un argomento tipo sNomePulsante as string e in base al nome eseguire il codice di interesse.
Ecco in questi punto non comprendo bene come agire e dove ma ci provo....
Post by casanmanerNota che la routine ImpostaCommandButtons va eseguita quando si effettui qualche modifica al VBA che "svuota" dalla memoria i contenuti delle variabili (in questo caso CommandButtons() As New Classe1).
Ecco in questo punto invece non comprendo bene ma credo di aver capito il senso. E cioè Classe1 porta memoria del nome del pulsante azionato che rende utile al Modulo Standard. Questo Workbook, grazie alla interazione tra questi due elementi, consente di poter agire sui vari pulsanti. Sarà così?
Ciao Casanmaner e grazie ancora, spero che tu mi possa rispondere.
Intanto ora provo a lavorarci su. Buona giornata
R.G.
Nel modulo di classe hai il corrispondente evento click (oltre ad altri eventi) tipico dei pulsanti (commandbutton).
Diversamente dovresti per ciascun pulsante creare tanti eventi click nel foglio dove sono presenti i pulsanti.
Lo scopo è di intercettare in un'unica procedura l'evento click e in tal modo avere un unico luogo dove intercettare quale è il pulsante su cui si è cliccato.
Diversamente nel modulo di classe del foglio (Foglio1 nell'esempio) avresti questo codice specifico per ciascun pulsante:
Private Sub CommandButton1_Click()
Call MiaRoutineBasataSulPulsante(Me.CommandButton1.Name, "Evento Click dal Modulo di classe specifico del foglio")
End Sub
Private Sub CommandButton2_Click()
Call MiaRoutineBasataSulPulsante(Me.CommandButton2.Name, "Evento Click dal Modulo di classe specifico del foglio")
End Sub
Private Sub CommandButton3_Click()
Call MiaRoutineBasataSulPulsante(Me.CommandButton3.Name, "Evento Click dal Modulo di classe specifico del foglio")
End Sub
Invece nel modulo di classe hai un'unica istruzione dell'evento Click comune a tutti i pulsanti di questo genere:
Private Sub CommandButton_Click()
Call MiaRoutineBasataSulPulsante(CommandButton.Name, "Evento Click del Modulo di Classe")
End Sub
Nel modulo1 sono presenti le istruzioni che memorizzano gli oggetti pulsante in una matrice che contiene i riferimenti agli oggetti commandbutton per fare in modo che il modulo di classe possa "intercettarne" l'azionamento.
Poiché questa matrice deve essere "riempita" con i riferimenti agli oggetti commandbutton occorre fare in modo che la routine ImpostaCommandButtons venga eseguita almeno una volta. Da qui l'utilizzo dell'evento Activate della cartella di lavoro (evento che viene eseguito anche quando si apre la cartella di lavoro e non solo quanto viene attivata passando da una diversa cartella di lavoro e questa).
Se però la cosa è troppo "complessa" puoi sempre utilizzare gli eventi click originari presenti nel modulo di classe del Foglio.
Vedi questo file dove ho inserito in modulo2 una routine che ha come argomento il nome del pulsante e viene azionata sia dagli eventi click nel foglio che quello presente nel modulo di classe.
L'ordine di esecuzione è prima gli eventi specifici dell'oggetto commandbutton del foglio e successivamente quello creato con il modulo di classe.
Otterrai due identici messaggi perché vengono azionati entrambi gli eventi click.
https://www.dropbox.com/s/h8mz10jh52vf4ut/Come%20indicare%20a%20VBA%20il%20pulsante%20premuto.xlsm?dl=0