Capita alle volte di registrare una macro per compiere una serie di azioni ripetitive automaticamente magari con una semplice pressione di due tasti. Alle volte però potrebbe essere necessario rendere il range, dove la macro va applicata, dinamico e selezionabile di volta in volta. Se pensiamo di voler formattare un’area selezionata con un verde oliva, bordi interni sottili su tutte le celle ed un bordo più spesso esterno e vogliamo che questa formattazione venga applicata tramite una macro ad un’area che noi selezioniamo di volta in volta basta procedere in questo modo.
Iniziamo col registrare una macro che compia tutte queste azioni di formattazione, dal menù visualizza premiamo il pulsante Macro e quindi Registra macro.
Ora siccome avevo gia fatto un’altra macro questa me la chiama Macro2, imposto il tasto di scelta rapida in modo da poter lanciare la macro semplicemente premendo CTLR +q
Una volta dato invio procediamo con tutti cambiamenti di formattazione che vogliamo applicare tramite macro. Scegliamo il colore
Tutti i bordi per avere bordi su tutte le celle
E Bordo casella spesso per avere il bordo esterno più marcato
Questo è il risultato finale
Ora possiamo interrompere la macro sempre dal menù Visualizza, Macro, Interrompi registrazione.
Ora premiamo ALT+F11 per andare all’editor di visual basic e selezioniamo il Modulo1 che contiene la nostra Macro2. La prima riga definisce il nome della macro ed eventuali parametri da passare alla macro che di solito si mettono all’interno delle parentesi dopo il nome. Le righe verdi sono dei commenti perchè preceduti dall’apostrofo ( ‘ ) quindi vengono ignorati dal programma, la prima istruzione è proprio il range che abbiamo selezionato nella fase di registrazione.
Cancelliamo la riga del range o se la vogliamo conservare ci mettiamo davanti un’apostrofo.
Per rendere la macro flessibile ci viene in contro il Metodo Application.Inputbox. Usiamo un oggetto MioRange che farà da contenitore per la selezione del range tramite Application.Inputbox, dopo la parentesi mettiamo un label che sarebbe un’aiuto per chi utilizzerà la macro in fututo in modo ricordare cosa si sta aspettando excel. Tutti gli altri parametri di Application.Inputbox non sono necessari ma dobbiamo specificare ad Application.Inputbox che introdurremo un Range che è l’ottavo parametro di questo metodo. Il primo parametro è il label mettiamo una serie 7 virgole e all’ottavo parametro mettiamo 8 per definire chè il valore passato alla funzione sarà un range.
Se volevamo passare una formula avremmo messo zero
0=Formula
1=Numero
2=Testo
4=Boleano (true,False)
8=Range
16=errore
32=Array di valori
Dopo aver definito il range tramite Set MioRange = Application.InputBox(“Selezionare Range”, , , , , , , 8) dobbiamo dire ad excel di selezionare tale range tramite MioRange.Select
Una volta fatto questo la macro è pronta.
Ora basta premere CTRL+q per fare apparire un form per l’inserimento del range. Ora non ci resta che selezionare nel foglio il range desiderato e premere il tasto OK nel form
E ripeterlo a volontà ….
Sub Macro2() ' ' Macro2 Macro ' ' Scelta rapida da tastiera: CTRL+q ' 'Range("D6:F11").Select Set MioRange = Application.InputBox("Selezionare Range", , , , , , , 8) MioRange.Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent3 .TintAndShade = 0.599993896298105 .PatternTintAndShade = 0 End With Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Range("F15").Select End Sub