Spostamento guidato col tasto "Invio" (Enter). - pagina vista: volte

Sappiamo che Excel consente di modificare la direzione da seguire alla pressione del tasto Invio. Di default lo spostamento segue la direzione "giu", cioè viene selezionata la cella sottostante la precedente, ma dal menù Strumenti/Opzioni/Modifica è possibile selezionare Direzione alla voce "Sposta la selezione dopo invio", scegliendo un'opzione a noi confacente.

Ovviamente l'impostazione scelta verrà mantenuta anche alla successiva riapertura di Excel, e fino ad una nuova impostazione.

A volte però gradiremmo poter disporre di selezioni "mirate", in particolare quando, "navigando" tra le celle di una tabella dati, vorremmo spostarci a destra e poi in basso, in modo da poter scorrere colonne e righe nell'area dati, in sequenza, una cella dopo l'altra. Esemplificheremo quindi il caso in cui ci si voglia spostare di cella in cella verso destra, sulla stessa riga, con spostamento alla cella iniziale della riga successiva una volta raggiunto l'estremo colonna, e proseguimento della sequenza, fino all'ultima cella dell'intervallo. Potrebbe essere il caso di una tabella dati nei quali manualmente dovremo variare i valori contenuti nelle celle. Tanto per capirci, una cosa del genere:

Per poter agire su un preciso intervallo (la nostra tabella dati) abbiamo bisogno di:

  1. definire su quale intervallo desideriamo intervenire.

  2. quale "evento" scegliere per attivare le istruzioni.

Per definire l'intervallo potremo impostare la zona dati con la classica sintassi Sheets(X).Range("rifcellainiziale:rifcellafinale"), oppure assegnare un "nome" all'area dati e utilizzare in "nome" al posto dei riferimenti cella, così: Sheets(X).Range("nome").

Per aree dati non fisse, o comunque variabili (inserimento nuove righe o colonne dati, cancellazione), usare un "nome" può rappresentare una valida soluzione in quanto sarà possibile ridefinire un nuovo intervallo senza bisogno di variare le istruzioni nel codice (vedi articolo "Assegnare nomi a intervalli").

Per quanto riguarda l'evento, sceglieremo l'evento Worksheet_Change, il più consono all'esempio proposto. Tra l'altro, l'argomento Target della funzione, ci consente di identificare la cella attiva che ha subito un cambiamento, e ci fornisce quindi le coordinate di questa cella (riga, colonna).

Per ottenere uno spostamento guidato della selezione, si possono seguire diverse strade; io presento una soluzione che consente di, una volta definito l'intervallo su cui agire, ottenere in automatico i riferimenti alla riga e alla colonna della cella iniziale dell'intervallo e a quella finale. Usiamo quindi quattro variabili che ci consentono di valutare la posizione della cella Target usata, all'interno dell'intervallo. Istruiamo quindi un Select Case che si occuperà di valutare in quale posizione il Target si trova e di eseguire le istruzioni opportune per spostarsi a destra rispetto al Target, oppure passare alla prima cella della riga successiva, prima colonna. Con il Target sull'ultima cella dell'intervallo faremo spostare la selezione alla prima cella dell'intervallo.

Le istruzioni ovviamente agiranno solo se saremo all'interno dell'intervallo e solo se avremo effettuato una variazione in una cella, negli altri casi lo spostamento della selezione avverrà secondo le impostazioni di default. Questa la routine:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Area As Range
Set Area = Sheets(2).Range("B2:D10")
'intervallo su cui agire. basterà variare i riferimenti per adattarlo
'Set Area = Range("AreaDati")  'se invece avremo assegnato un "nome" all'intervallo, useremo quello (es. AreaDati)
pr = Area.Item(1).Row 
 'con "pr" prendiamo il numero della prima riga dell'intervallo "Area"
pc = Area.Item(1).Column  
 'con "pc" prendiamo il numero della prima colonna dell'intervallo "Area"
ur = Area.Cells.SpecialCells(xlCellTypeLastCell).Row
'con "ur" prendiamo il numero dell'ultima riga dell'intervallo "Area"
uc = Area.Cells.SpecialCells(xlCellTypeLastCell).Column
'con "uc" prendiamo il numero dell'ultima colonna dell'intervallo "Area"
'poi: con la variabile "rt" reperiamo la riga della cella che ha subito un cambiamento (la cella Target) e con "ct" il numero di 'colonna
rt = Target.Row
ct = Target.Column

'ora confrontiamo le posizioni della colonna e riga della cella target; in pratica se la colonna è inferiore all'ultima colonna, 'incrementiamo di 1 la colonna e selezioniamo la cella a destra della cella Target, nel caso che invece sia uguale, incrementiamo 'di 1 il numero di riga e selezioniamo la cella una riga sotto alla cella target, prima colonna. Se saremo infine all'ultima cella, 'selezioniamo la prima cella dell'intervallo, ritornando all'inizio.
Select Case ct
Case Is < uc
   Cells(rt, ct + 1).Select

Case Is = uc
   Select Case rt
          Case Is = ur
          Cells(pr, pc).Select
   Case Else
          Cells(rt + 1, pc).Select
   End Select
End Select

End Sub




Questo è tutto, buon lavoro.

 

prelevato sul sito www.ennius.altervista.org