Creare le routine di evento

    
    Finora ci siamo interessati di creare i controlli personalizzati di interfaccia, ora vediamo come associare i comandi al codice che deve essere eseguito quando operiamo sugli stessi. Creiamo un nuovo modulo di codice ed inseriamo il codice seguente.
    	Dim CmdBarEvents As New Classe1
    
    	Sub shortcut()
    	Dim Corto As CommandBar
       
    	Set Corto = Application.CommandBars.Add _
    	 (Name:="SceltaRapida", Position:=msoBarPopup)
    	Corto.Controls.Add.Caption = "&Voce 1"
    	Corto.Controls.Add.Caption = "&Voce 2"
    	Set CmdBarEvents.Bottone = Corto.Controls("&Voce 1")
    	Set CmdBarEvents.Bottone1 = Corto.Controls("&Voce 2")
    	End Sub
    
    	Sub MostraCorto()
    	Application.CommandBars("SceltaRapida").ShowPopup
    	End Sub
        
    La routine "shortcut()" crea un menù di scelta rapida, ovvero uno dei classici menù che appaiono quando clicchiamo col tasto destro del mouse. Nel nostro caso specifico il menù verrà visualizzato quando eseguiremo la routine "MostraCorto()", ovviamente dopo avere lanciato "Shortcut()".
    La variabile "CmdBarEvents" dichiara una istanza della classe "Classe1" che contiene la routine di evento per i controlli che abbiamo creato. La dichiarazione riguarda anche le righe di "Set" alla fine della routine "Shortcut()". Quando facciamo click su "Voce1" attiviamo la routine "Bottone_Click" del modulo di classe "Classe1" mentre se facciamo click su "Voce2" attiviamo la routine "Bottone1_Click". Creiamo un nuovo modulo di classe dal menù "Inserisci", "Modulo di Classe", a cui verrà assegnato automaticamente il nome di "Classe1" ed inseriamo il codice seguente.
    	Public WithEvents Bottone As Office.CommandBarButton
    	Public WithEvents Bottone1 As Office.CommandBarButton
    
    	Private Sub Bottone_Click(ByVal Controllo As _ 
    	Office.CommandBarButton, CancelDefault As Boolean)
    	MsgBox Controllo.Caption & _ 
    	" è il controllo che hai selezionato"
    	End Sub
    	Private Sub Bottone1_Click(ByVal Controllo As _ 
    	Office.CommandBarButton, CancelDefault As Boolean)
    	MsgBox Controllo.Caption & _ 
    	" è il controllo che hai selezionato"
    	End Sub
        
    L'uso della parola chiave "WithEvents", a cui abbiamo assegnato le variabili oggetto "Bottone" e "Bottone1" in cima al modulo, indica che le variabili di classe vengono usate per rispondere agli eventi attivati dai pulsanti ad essi collegati. Di conseguenza l'evento click dei controlli "Voce 1" e "Voce 2" è associato alle variabili "Bottone" e "Bottone1". Se clicchiamo su "Voce1" e "Voce 2" verrà visualizzata una finestra di messaggio che ci indica quale controllo è stato selezionato.
    Vediamo ora come creare un pulsante tipo interruttore. Innanzitutto inseriamo un nuovo modulo di codice, creiamo un nuovo pulsante personalizzato nella barra "Standard" e lo posizioniamo come primo pulsante della barra.
    	Dim ComBarEvent As New Classe2
    	Sub Inserisci_Bottone()
    	Dim IstBottone As Office.CommandBarButton
    	Set IstBottone = Application.CommandBars("Standard")._
    	Controls.Add(msoControlButton, , , before:=1)
    	With IstBottone
    		.Caption = "P&ulsante su"
    		.State = msoButtonUp
    		.FaceId = 2950
    		.Tag = "Pulsante nuovo"
    		Set ComBarEvent.Bottone = IstBottone
    	End With
    	End Sub
        
    Creiamo un nuovo modulo di classe ed inseriamo il codice seguente. La routine valuta lo stato del pulsante associato: se lo stato è "msoButtonUp" (non premuto) viene impostato a "msoButtonDown" (premuto) e viceversa. Per fare compiere qualcosa di utile al nostro pulsante basta sostituire le MessageBox con delle istruzioni più fantasiose.
    	Private Sub Bottone_Click(ByVal Controllo As _ 
    	Office.CommandBarButton, CancelDefault As Boolean)
    	If Controllo.State = msoButtonDown Then
    		Controllo.State = msoButtonUp
    		MsgBox "Il punsalte NON è premuto"
    	Else
    		Controllo.State = msoButtonDown
    		MsgBox "Il punsalte è premuto"
    	End If
    	End Sub
        
    L'esempio seguente può essere utile se vogliamo modificare le funzionalità di un comando predefinito di Excel, . La routine disabilita le funzioni di una determinata voce del menù "File" alla quale noi potremo associare il nostro codice.
    	Dim ComEvento As New Classe2
    	Sub Annullamento()
    	Dim BarCom As Office.CommandBarButton
    	Set BarCom = CommandBars("File").FindControl(ID:=23)
    	Set ComEvento.openctrl = BarCom
    	End Sub
        
    L'ID 23 corrisponde, nella mia versione di Office, al comando "Apri" sia nel menu "File" che nella barra "Standard". Spero sia lo stesso anche nella vostra versione, altrimenti potete ricercare l'ID associato del pulsante "Apri" con la routine "ControlliBarrecomando()" vista in precedenza.
    	Public WithEvents openctrl As Office.CommandBarButton
    
    	Private Sub openctrl_Click(ByVal Controllo As _ 
    	Office.CommandBarButton, CancelDefault As Boolean)
    	    CancelDefault = True
    	    MsgBox Controllo.Caption & _ 
    	    " il controllo è disabilitato"
    	End Sub
        
    Sostituendo la MessageBox con delle istruzioni più significative avremo modificato il comportamento di un pulsante predefinito.