› Sviluppare funzionalita su Microsoft Office con VBA › riga selezionata
-
AutoreArticoli
-
Ciao a tutti.
Questa macro in thisworkbook
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)'per riga attiva colorata con formattazione nei fogliTarget.Calculate '<<< per riga attiva colorata con formattazioneEnd Subabbinata poi in formattazione condizionale
=CELLA("RIGA")=RIF.RIGA()
è per evidenziare la riga in cui si lavora.
E' possibile se per esempio ho selezionato 3 righe queste vengono evidenziate?
Ora funziona solo per una riga.
Buonasera @Franck_Ciccio,
ma questo Thread fa per caso riferimento a questo indicato qui in basso sempre creato da te?
Ciao alexis81, quello che chiedo in questo thread poi lo devo addattare con la macro dell'altro thread. Siccome il range che devo controllare è di moltissime righe per velocizzare chiedevo se possibile modificare la macro, che ho inserito in questo thread, per evidenziare le righe.
Prova questo codice e vedi se può andar bene. Elimina però la Formattazione Condizionale
Option Explicit Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Target.EntireRow.Interior.ColorIndex <> 36 Then Target.EntireRow.Interior.ColorIndex = 36 Else Target.EntireRow.Interior.ColorIndex = xlNone End If End Subse vuoi un colore diverso consulta l'indice dei ColorIndex. Trovi la tabella sul Web. Oppure se cerchi un colore particolare utilizza il metodo RGB(red, green, blue) così lo crei come preferisci.
Grazie alexps81 non è quello che pensavo.
La riga viene evidenziata da A fino alla fine XFD, invece come la formattazione vorrei solo per righe presenti.
Allora si deve impostare un range. Qual è la zona delle righe che t'interessa evidenziare?
Come per la formattazione è variabile secondo il range delle righe.
Ora è A2:I500
Prova questo allora:
Option Explicit Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim zona As Range Dim ur As Long If Target.Count > 1 Then Exit Sub ur = Cells(Rows.Count, "A").End(xlUp).Row Set zona = Range("A2:I" & ur) If Not Intersect(Target, zona) Is Nothing Then If Target.Interior.ColorIndex <> 36 Then Range(Cells(Target.Row, "A"), Cells(Target.Row, "I")).Interior.ColorIndex = 36 Else Range(Cells(Target.Row, "A"), Cells(Target.Row, "I")).Interior.ColorIndex = xlNone End If End If Set zona = Nothing End SubSe la vuoi leggermente più dinamica prova questa:
Option Explicit Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim zona As Range Dim ur As Long If Target.Count > 1 Then Exit Sub ur = Cells(Rows.Count, "A").End(xlUp).Row Set zona = Range("A2:I" & ur) If Not Intersect(Target, zona) Is Nothing Then If Target.Interior.ColorIndex <> 36 Then Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 36 Else Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = xlNone End If End If Set zona = Nothing End Subin pratica se vuoi estendere la lunghezza del rigo oltre la colonna "I", ti basta modificare la variabile ZONA. Stesso discorso se vuoi ridurre la lunghezza.
abbinata poi in formattazione condizionale
=CELLA("RIGA")=RIF.RIGA()
è per evidenziare la riga in cui si lavora.
E' possibile se per esempio ho selezionato 3 righe queste vengono evidenziate?
Potresti allegare un file di esempio (coerente con l'originale) per capire l'ambiente in cui stiamo operando (range, formati celle particolari, etc.).
Ciao a tutti.
Grazie alexps81 la tua macro funziona, solo che le righe si evidenziano per tutti i fogli.
Con la formattazione condizionale che ho postato in post#1 e che è anche nell'allegato si può fare per i fogli interessati.
Allegati:
You must be logged in to view attached files.Ciao,
Be' certo...tu all'inizio avevi detto che Questa macro in ThisWorkbook...
Io mi sono attenuto alla richiesta, ma nulla ti vieta di spostare la macro direttamente nel SelectionChange di un Foglio specifico.
Ora sono sprovvisto di PC, ma dovresti essere in grado di risolvere in autonomia.
Fammi sapere...poi ho letto l'altra richesta in merito al conteggio delle righe selezionate. Ma la devi inglobare in questa macro? Se è così poi ti giro un esempio appena riesco.
Una domanda: che la riga selezionata resti evidenziata anche quando ne selezioni un'altra è una cosa voluta (dopo un po' avrai tutto evidenziato)?
Controllando bene la macro di alexps81 per togliere il colore bisogna ricliccare nelle righe colorate nel foglio1
Nel foglio2 c'è la formattazione condizionale, per una sola riga. Qui ad ogni spostamento c'è solo 1 riga evidenziata, quella attiva.
L'ideale sarebbe che anche per la macro di alex che si sia sempre una riga evidenziata quella attiva e che se poi seleziono più righe queste siano evedenziate. Tolto la selezione delle righe sia poi evidenziata la riga attiva
Allegati:
You must be logged in to view attached files.Tolto la selezione delle righe sia poi evidenziata la riga attiva
Cosa significa "tolto la selezione"?
Mi spieghi passo-passo come selezioni più righe (mouse?, frecce?, menu?)
Nell'ultimo allegato foglio2 clicco nelle celle o numero riga questa si evidenzia.
Di solito per selezionare più righe si clicca con CTRL.
Io vorrei che siano poi evidenziate oltre alla riga attiva anche le altre che edenzio cliccando nel numero riga con CTRL , poi ricliccando in un'altra riga resta solo 1 riga evidenziata.Ciao a tutti, approfitto della presenza di scossa per fargli vedere una mia problematica inerente al quesito. Usando questo VBA, visualizzo le righe RrI + RrF con valori giusti (posso selezionare diverse righe oppure selezionare una cella) però mi colora sempre una riga sotto e non capisco il motivo???
Option Explicit Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim zona As Range Dim ur As Long, RrI As Long, RrF As Long ur = Cells(Rows.Count, "A").End(xlUp).Row Set zona = Range("A2:R" & ur) zona.Interior.ColorIndex = xlNone If Not Intersect(Target, zona) Is Nothing Then RrI = Target.Offset(0, 0).Row RrF = RrI + (Selection.Rows.Count - 1) zona.Rows(RrI & ":" & RrF).Interior.ColorIndex = 6 End If Set zona = Nothing End SubIn rete ho trovato questa macro che è quasi come cerco io, solo che funziona per tutta la riga io cerco invece per il range presente e poi questa toglie tutti i colori delle celle.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone With Selection .EntireRow.Interior.ColorIndex = 40 End With Selection.Interior.ColorIndex = xlNone End SubCiao @raffaele53,
provo a risponderti io
Con il fatto che hai creato un range "zona" che va dal rigo 2 a ur allora per l'istruzione che hai scritto (zona.Rows(RrI & ":" & RrF).Interior.ColorIndex = 6)...se per caso selezioni il rigo 7, per il discorso di cui sopra, il settimo rigo risulta essere l'ottavo...perché il rigo 1 parte dal 2 (scusa il giro di parole). Per intenderci...se zona = Range("A4:R" & ur) ti ritroveresti 3 righe sotto.
In base alla variabile zona...io suggerisco di modificare il codice così:
zona.Rows(RrI - 1 & ":" & RrF - 1).Interior.ColorIndex = 6Ciao @franck_ciccio,
ti giro un codice ma prima di cantar vittoria vorrei il benestare di @scossa
In pratica attraverso un API (GetKeyState) andiamo ad intercettare il tasto CTRL premuto. Io speravo che funzionasse tenendo premuto CTRL e selezionando le righe ma purtroppo così non è forse perché va in conflitto con il fatto che nativamente premendo CTRL e facendo click con il mouse su una cella, non fai altro che selezionarla in aggiunta a quella/e già selezionata.
Ora ho notato che se tieni premuto contemporaneamente SHIFT + CTRL e click del mouse su una cella, allora la macro funziona. Però ti dico la verità...non so come mai e sinceramente la cosa di non saperlo non mi fa impazzire...perciò chiedo lumi a qualche esperto in materia.
Cmq tu per ora prova e dimmi cosa ne pensi. In pratica, fai click con il mouse su una cella e il rigo si seleziona, se fai click su un'altra cella, succede che il rigo selezionato si deseleziona e il rigo della cella selezionata si seleziona. Se invece tieni premuto SHIFT + CTRL e fai click su un'altra cella allora il rigo precedente rimane selezionato e in più si seleziona anche il rigo della nuova cella selezionata.
Metti questo in un MODULO:
Option Explicit 'GetKeyState Public Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integere quest'altro nel foglio:
Option Explicit Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim zona As Range Dim ur As Long ur = Cells(Rows.Count, "A").End(xlUp).Row Set zona = Range("A2:R" & ur) If Not Intersect(Target, zona) Is Nothing Then If GetKeyState(17) < 0 Then 'tasto ctrl Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32 Exit Sub End If If Target.Interior.ColorIndex <> 32 Then zona.Interior.ColorIndex = xlNone Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32 End If End If Set zona = Nothing End SubCiao,
questa il codice che ho pensato per la tua esigenza:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim rTable As Range, rRow As Range, nRows As Long If Sh.Name = "Foglio3" Then Set rTable = Intersect(Sh.UsedRange, Sh.UsedRange.Offset(3)) If Not Intersect(Target, rTable) Is Nothing Then rTable.Interior.ColorIndex = xlNone For Each rRow In Selection.Areas With rRow Intersect(.EntireRow, rTable).Interior.ColorIndex = 8 End With Next rRow End If Else Target.Calculate '<<< per riga attiva colorata con formattazione End If End SubSe .UsedRange eccede la tua tabella sostituisci
Set rTable = Intersect(Sh.UsedRange, Sh.UsedRange.Offset(3))con
Set rTable = Intersect(Sh.UsedRange, Sh.Range("A4:L10000"))dove 10000 è un valore a piacere purché maggiore del numero di righe previsto possa occupare in futuro la tabella
Ora ho notato che se tieni premuto contemporaneamente SHIFT + CTRL e click del mouse su una cella, allora la macro funziona. Però ti dico la verità...non so come mai e sinceramente la cosa di non saperlo non mi fa impazzire..
Ciao,
il problema nel tuo codice è qui:
If GetKeyState(17) < 0 Then 'tasto ctrl Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32 Exit Sub End Ifdove in Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32
fai riferimento a Target ma, se selezioni con ctrl premuto, Target resta sempre la prima cella che hai selezionato; ti basterà sostituire Target con ActiveCell e risolvi.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim zona As Range Dim ur As Long ur = Cells(Rows.Count, "A").End(xlUp).Row Set zona = Range("A2:R" & ur) If Not Intersect(Target, zona) Is Nothing Then If If GetKeyState(17) < 0 Then 'tasto ctrl Cells(ActiveCell.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32 Exit Sub End If If Target.Interior.ColorIndex <> 32 Then zona.Interior.ColorIndex = xlNone Cells(Target.Row, 1).Resize(1, zona.Columns.Count).Interior.ColorIndex = 32 End If End If Set zona = Nothing End SubN.B.: poiché in VBA True vale -1 l'istruzione
If GetKeyState(17) < 0 Thenpuò semplificarsi inIf GetKeyState(17) Then@scossa Perchè >>>Workbook_SheetSelectionChange<<< che non capisco? Cosa dovrebbe fare?
scusa, ho dimenticato di specificarlo: visto che frank_ciccio parlava di poter applicare l'evidenza ad alcuni fogli in particolare, ho usato l'evento Workbook_SheetSelectionChange che viene richiamato quando si seleziona una cella di qualsiasi foglio, folgio che viene passato con l'argomento Sh. Quindi basta decidere per quali fogli attivare il codice senza doverlo scrivere in tutti i fogli.
Ovviamente per quei fogli andrà eliminato il codice di evento Worksheet_SelectionChange().
ho usato l'evento Workbook_SheetSelectionChange
E per essere chiarissimi, quel codice va nel modulo di ThisWorkbook perche' e' un evento del Workbook (non di un foglio, ne' a se stante in un modulo di codice).
-
AutoreArticoli
