Gianni Giaccaglini

Tricks & mini applics on WPF
posts - 46, comments - 0, trackbacks - 0

Usare l'evento SelectionChange per lanciare macro

L'evento SelectionChange lancia macro differenziate

Premessa. Il Ribbon personalizzato nella maggioranza dei casi si presenta complesso da implementare e gestire e costituisce un "troppa grazia" per gli usi correnti, così molti utenti si arrangiano incollando sul foglio di lavoro dei controlli, quali Listbox e pulsanti, questi ultimi a loro volta associati a determinate macro VBA.

Questa sciocchezzuola, cui forse pochi pensano, sfrutta l'evento SelectionChange per surrogare tale comportamento. Andiamo al sodo con un primo esempio che illustra un certo Foglio1 ove è presente una serie di valori, quali  "Giallo", "Bianco" ecc. V. l'immagine riportatain fondo a questo post. In loro vece si immaginino analoghi colori di riempimento delle celle in C6:F9 (è solo un esmpio, ripeto).

Ed ecco la prima macro:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   ' Exit Sub ' Usato in fase di layout
   If Intersect(Target, Range("ZonaSelChange")) Is Nothing Then Exit Sub
   MsgBox "La cella " & Target.Address(False, False) & " ha indice colore = " & Target.Interior.ColorIndex
   Range("A1").Select ' De-seleziona Zona Frutti
End Sub

Tale codice ha lo scopo banale di lanciare un messaggio che indica il colore di ciascuna cella in C6:F8 ma ovviamente andrà personalizzato a seconda dei casi pratici. Importanti sono le istruzioni a monte e a valle: la prima evita l'azione scatenata se la cella selezionata è esterna a "ZonaSelChange", la seconda, selezionando sistematicamente la cella A1 permette di riattivare la macro precedente. Infatti non va dimenticato che SelectionChange si scatena solo se viene selezionata una cella diversa dalla precedente.

La variante sul Foglio2

Stavolta si abbia un intervallino del genere i cui elementi hanno nome "Frutti" (e, all'atto della creazione, il generico "Tabella1":

Frutto
Mele
Pere
Susine
Albicocche
Pesche
Ciliegie

La macro, che stavolta lascio all'esegesi autogestita del paziente lettore è subito vista:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  ' Exit Sub Servita per creare il layout
  If Intersect(Target, Range("Frutti")) Is Nothing Then Exit Sub
  Select Case Target.Address(False, False)
    Case "C3"
    MsgBox "Macro delle " & Target.Value
    Case "C4"
    MsgBox "Macro delle " & Target.Value
    Case "C5"
    MsgBox "Macro delle " & Target.Value
    Case "C6"
    MsgBox "Macro delle " & Target.Value
     Case "C7"
    MsgBox "Macro delle " & Target.Value
    Case "C8"
    MsgBox "Macro delle " & Target.Value
  End Select
  Range("A1").Select ' De-seleziona ZonaSleChange
End Sub

Il clic sulle varie celle lancia messaggi al limite del grottesco ("Macro delle mele", "Macro delle pere", nientemeno!) ma l'adattamento a casi concreti è facilmente immaginabile.

NOTA IMPORTANTE. Il massimo vantaggio di questi procedimenti si ottiene non tanto surrogando controlli ActiveX o classici, bensì sfruttando celle facenti parte del modello Excel.

Meditate, gente meditate. 

       A    B    C    D    E    F G H I
  1   Evento SelectionChange per lanciare macro differenziate  
  2 Al clic su una cella dell'intervallo C6:F8 denominata        
  3 ZonaSelChange viene indicato il color-index  è solo un esempio...)    
  4 N.B. - Al termine viene selezionata A1, consentendo così di attivare anche  la cella precedente
  5                    
  6     Giallo  Bianco  Rosso  Bianco        
  7      Bianco  Blu Bianco  Rosa        
  8      Marrone Bianco Rosso   Bianco        
  9                    
10                    
11               Sul Foglio2 si ha una variante dell'uso dell'evento SelectionChange
12                    

Print | posted on giovedì 23 luglio 2015 16:24 |

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 5 and 2 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET