Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Modifica macro per evidenziare cella

63 views
Skip to first unread message

Guido Cei

unread,
Feb 9, 2017, 9:53:46 AM2/9/17
to
Ciao a tutti/e,

utilizzo una macro su un foglio di lavoro grazie alla quale ogni volta che seleziono una cella, l'intera riga viene evidenziata e quando passo ad un'altra cella, posta su una riga differente, l'evidenziazione scompare sulla precedente e viene evidenziata la nuova riga.

A me tornerebbe meglio che non si evidenziasse l'intera riga ma la sola cella corrispondente a quella attiva, posta nella prima colonna:
faccio un es.
vorrei che se seleziono la cella H6 si evidenzi la cella A6, passo su D25 e A6 torna al colore di default, mentre si evidenzia A25 e così via.

In basso copia la macro di cui sopra:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = x1None
With ActiveCell
.EntireRow.Interior.ColorIndex = 36
End With
End Sub


ho provato a modificarla per conto mio ma ottengo sempre un errore

grazie a chiunque abbia tempo e voglia da dedicare

Norman Jones

unread,
Feb 9, 2017, 10:04:01 AM2/9/17
to
Ciao Guido,

On 09/02/2017 14.53, Guido Cei wrote:
> Ciao a tutti/e,
>
> utilizzo una macro su un foglio di lavoro grazie alla quale ogni volta che seleziono una cella, l'intera riga viene evidenziata e quando passo ad un'altra cella, posta su una riga differente, l'evidenziazione scompare sulla precedente e viene evidenziata la nuova riga.
>
> A me tornerebbe meglio che non si evidenziasse l'intera riga ma la sola cella corrispondente a quella attiva, posta nella prima colonna:
> faccio un es.
> vorrei che se seleziono la cella H6 si evidenzi la cella A6, passo su D25 e A6 torna al colore di default, mentre si evidenzia A25 e così via.
>
> In basso copia la macro di cui sopra:
>
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> Cells.Interior.ColorIndex = x1None
> With ActiveCell
> ..EntireRow.Interior.ColorIndex = 36
> End With
> End Sub
>
>
> ho provato a modificarla per conto mio ma ottengo sempre un errore

Prova qualcosa del genere:

'=========>>
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.Cells.Interior.ColorIndex = xlNone
With Target
.EntireRow.Cells(1).Interior.ColorIndex = 36
End With
End Sub
'<<=========




===
Regards,
Norman

Norman Jones

unread,
Feb 9, 2017, 10:09:20 AM2/9/17
to

Ciao Guido,

On 09/02/2017 15.03, Norman Jones wrote:

> Prova qualcosa del genere:
>
> '=========>>
> Option Explicit
>
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> Me.Cells.Interior.ColorIndex = xlNone
> With Target
> .EntireRow.Cells(1).Interior.ColorIndex = 36
> End With
> End Sub
> '<<=========

Oppure, più semplicemente:

'=========>>
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.Cells.Interior.ColorIndex = xlNone
Target.EntireRow.Cells(1).Interior.ColorIndex = 36

Guido Cei

unread,
Feb 10, 2017, 2:45:31 AM2/10/17
to
Grazie mille!!!

sto provando ed è esattamente quello che volevo.

se posso chiedere, che differenza c'è di approccio tra la prima e la seconda soluzione che hai postato? giusto per provare a capire meglio e non prendere solo la tua soluzione come un semplice copia-incolla

In ogni caso grazie ancora

Norman Jones

unread,
Feb 10, 2017, 7:41:32 AM2/10/17
to
Ciao Guido,

On 10/02/2017 7.45, Guido Cei wrote:
> Grazie mille!!!
>
> sto provando ed è esattamente quello che volevo.

Bene! Ti ringeazio per il cortese riscontro.

> se posso chiedere, che differenza c'è di approccio tra la
> prima e la seconda soluzione che hai postato? giusto per
> provare a capire meglio e non prendere solo la tua soluzione
> come un semplice copia-incolla

Ottima filosofia! In questo modo si impara!

Molto spesso si può rendere il codice più efficiente, sostituendo più
istanze di un singolo oggetto con una struttura del tipo With / End With

A questo proposito, considera il seguente codice banale per formatare
una cella:
'=========>>
Public Sub Tester()
ActiveSheet.Range("A2").Font.Name = "Arial Black"
ActiveSheet.Range("A2").Font.Size = 14
ActiveSheet.Range("A2").Font.Strikethrough = True
ActiveSheet.Range("A2").Font.Superscript = False
ActiveSheet.Range("A2").Font.Subscript = False
ActiveSheet.Range("A2").Font.OutlineFont = False
ActiveSheet.Range("A2").Font.Shadow = True
ActiveSheet.Range("A2").Font.Underline = xlUnderlineStyleSingle
ActiveSheet.Range("A2").Font.ThemeColor = xlThemeColorAccent4
ActiveSheet.Range("A2").Font.TintAndShade = 0
ActiveSheet.Range("A2").Font.ThemeFont = xlThemeFontNone
End Sub
'<<=========

Con questo codice, per ogni riga di codice, VBA deve ri-interpretare
l'oggetto
ActiveSheet.Range("A2")

Potremmo rendere il codice molto più efficiente, meno verboso e,
inoltre, più comprensibile, con l'uso della struttura With / End With:

'=========>>
Public Sub Tester()
With ActiveSheet.Range("A2")
.Font.Name = "Arial Black"
.Font.Size = 14
.Font.Strikethrough = True
.Font.Superscript = False
.Font.Subscript = False
.Font.OutlineFont = False
.Font.Shadow = True
.Font.Underline = xlUnderlineStyleSingle
.Font.ThemeColor = xlThemeColorAccent4
.Font.TintAndShade = 0
.Font.ThemeFont = xlThemeFontNone
End With
End Sub
'<<=========

Torniamo ora alla prima versione del codice, che avevo postato nella mia
prima risposta, ossia

>>> '=========>>
>>> Option Explicit
>>>
>>> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>>> Me.Cells.Interior.ColorIndex = xlNone
>>> With Target
>>> .EntireRow.Cells(1).Interior.ColorIndex = 36
>>> End With
>>> End Sub
>>> '<<=========

Qui, trattandosi di una sola istanza dell'oggetto di interesse, ovvero
l'oggeto Target, non vi è alcun vantaggio né la necessità per l'uso
della struttura With/End With e di conseguenza, sarebbe preferibile
eliminarla. Pertanto, ho suggerito:

>> Oppure, più semplicemente:
>>
>> '=========>>
>> Option Explicit
>>
>> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>> Me.Cells.Interior.ColorIndex = xlNone
>> Target.EntireRow.Cells(1).Interior.ColorIndex = 36
>> End Sub
>> '<<=========

Nel caso che la mia spiegazione fosse poco chiara, chiedi pure ulteriore
delucidazioni.





===
Regards,
Norman

Guido Cei

unread,
Feb 11, 2017, 5:54:14 AM2/11/17
to

Grazie ancora.

Sei stato molto chiaro e molto utile!

Quindi la seconda opzione è maggiormente indicata per la soluzione in quanto più "pulita" ed "immediata" come codice.

Un saluto
0 new messages