maurogsc.eu
mauro gamberini


home ==> Excel: articoli ==> Workbook - Evento SheetSelectionChange di ThisWorkbook

Workbook - Evento SheetSelectionChange di ThisWorkbook

Situazione.
Vediamo nell'articolo di analizzare  l'evento SheetSelectionChange di ThisWorkbook.

Nota.
Il codice dell’esempio, scaricabile a questo link, è commentato e nella cartella in formato .zip è contenuto un file di Excel i formato .xls. Il codice ed il file sono forniti *così come sono* e l’autore declina ogni responsabilità su eventuali problemi causati dal codice o dal file se usati impropriamente. Utilizzate gli esempi forniti o files di test per le vostre prove. Codice e file sono stati testati con(e quindi validi per) Excel 2000/Xp(2002)/2003/2007/2010.

Cos'è l'evento SheetSelectionChange.
Un evento è una routine particolare che viene eseguita in risposta a qualcosa fatto dall'utente o da altro codice. Nel caso specifico, l'evento SheetSelectionChange di ThisWorkbook si verifica(viene scatenato) ogni volta che via mouse, via tastiera o via codice modifichiamo la selezione su di un foglio del Workbook(cartella/file) a cui ThisWorkbook fa riferimento. Il codice che gestisce l'evento è visualizzabile nel modulo di codice di ThisWorkbook. Nel modulo di codice di ThisWorkbook, ad esempio, in alto a sx nella ComboBox dove troviamo: (generale), selezioniamo: Workbook e nella ComboBox di dx selezioniamo: SheetSelectionChange. Verrà così aggiunto il codice per gestire l'evento SheetSelectionChange. Aggiungiamo un semplice codice in modo che il nostro evento abbia questo aspetto;

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "Foglio: " & Sh.Name & vbNewLine _
        & "Range: " & Target.Address
End Sub

Torniamo in *Excel lato celle* con ALT+F11 e selezioniamo una cella di un foglio qualsiasi. La MsgBox ci mostrerà il riferimento al foglio e alla cella selezionata. Cambiamo foglio e selezione e/o proviamo a selezionare più celle, gruppi di celle, colonne, righe e vediamo come risponde l'evento SheetSelelectionChange e cosa ci restituisce nella MsgBox.

Utilizziamolo da codice
L'evento SheetSelectionChange può essere utilizzato anche da codice. Ad esempio quando modifichiamo la cella selezionata tramite il codice di una macro, l'evento risponderà . Un esempio forse vale, come sempre, più di 1000 parole. Modulo di codice di ThisWorkbook con il codice che abbiamo già visto:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "Foglio: " & Sh.Name & vbNewLine _
        & "Range: " & Target.Address
End Sub

E questo codice invece in un modulo standard:

Public Sub m_1()
    
    'dichiaro le variabili
    Dim wk As Workbook
    Dim sh As Worksheet
    
    'metto un riferimento al Workbook
    'che contiene il modulo di codice
    Set wk = ThisWorkbook
    
    With wk
        'metto un riferimento al Foglio1
        'di questo Workbook
        Set sh = .Worksheets("Foglio1")
    End With
    
    With sh
        'seleziono il Foglio1
        .Select
        'seleleziono la cella sotto
        'alla cella attiva, richiamando
        'così l'evento SelectionChange
        'del Foglio1
        ActiveCell.Offset(1, 0).Select
        'codice commentato per la
        'selezione di un Range di celle
        'sul Foglio1(se utilizzato,
        'commentare l'altra selezione)
        '.Range("A1:C10").Select
    End With
    
    'Set a Nothing delle variabili oggetto
    Set sh = Nothing
    Set wk = Nothing
    
End Sub

I parametri Sh e Target.
L'evento SheetSelectionChange ha due parametri, Sh e Target. Il primo, Sh, ha un riferimento al foglio sul quale si sta modificando la selezione. Il secondo, Target, ha un riferimento all'oggetto di tipo Range selezionato. Sia Sh che Target espongono e mettono a disposizione i metodi e le proprietà degli oggetti a cui fanno riferimento. Il codice qui sotto, che nell'esempio scaricabile è commentato(non attivo), colora di giallo lo sfondo delle vostre selezioni fatte sui fogli del Workbook:

Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range)
    With sh
        'elimino il colore di sfondo da
        'tutte le celle del foglio a
        'cui fa riferimento Sh
        .Cells.Interior.ColorIndex = xlNone
    End With
    With Target
        'coloro di giallo lo sfondo
        'del Range a cui fa riferimento
        'Target
        .Cells.Interior.ColorIndex = 6
    End With
End Sub

Si potrebbe sfruttare il parametro Sh per centralizzare, in modo selettivo, l'evento SelectionChange di tutti i fogli. Riprendendo quanto fatto nel codice precedente, vogliamo che sul Foglio2 non si colori di giallo lo sfondo, mentre vogliamo sia fatto per i Fogli1 e Foglio3(anche questo codice è commentato nel file d'esempio scaribabile).

Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range)
    With sh
        'controllo che il riferimento
        'di Sh non sia il Foglio2
        If .Name <> "Foglio2" Then
            'elimino il colore di sfondo
            'dalle celle del foglio
            .Cells.Interior.ColorIndex = xlNone
            'metto il colore di sfondo giallo
            'al Range a cui fa riferimento Target
            Target.Cells.Interior.ColorIndex = 6
        End If
    End With
End Sub

Ricordo che esiste l'evento SelectionChange relativo al foglio, per il quale trovate alcune cosiderazioni qui: Worksheet - Evento SelectionChange.

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 17/11/2009 - mauro gamberini