Cercare la prima riga libera. - pagina vista: volte

Questo articolo forse non necessario, segue e riunisce i concetti e le procedure già utilizzate sui miei due siti in moltissimi articoli dove si ricerca una riga libera per incollare o scrivere dati, per cui sarò conciso e stringato.

Intanto una riga (o una colonna) si identifica dal suo numero indice, e mentre per le righe, i numeri li leggiamo all'estrema sinistra del foglio dove stanno appunto le "intestazioni di riga", per le colonne che abitualmente vediamo indicate con lettere dell'alfabeto, per conoscere il loro numero indice, possiamo o contarle manualmente iniziando da sinistra, o impostare la modalità "Stile di riferimento R1C1" dal menù Strumenti/Opzioni/Generale/Impostazioni mettendo un segno di spunta alla relativa casella (salvo poi ritornare allo "stile di riferimento A1") : in questo modo possiamo leggere numeri anzichè lettere nelle intestazioni di colonna. Comunque entrambi i numeri di riga e di colonna iniziano su ogni foglio, sempre da 1; non esiste nè la riga zero nè la colonna zero.

In inglese la parola "riga" si traduce con "Row" e "colonna" con "Column", esenza entrare nel merito degli "insiemi" (Rows o Columns, con la "s", al plurale), diciamo che sia Row che Column sono "proprietà" dell'insieme "Range", cioè in pratica sono proprietà che ogni cella possiede.

Ora, qualunque sia la sintassi che usiamo per identificare una cella: Range("rif_cella"), opp. Cells(rif_riga, rif_col), ActiveCell, ecc. ecc., per conoscere a quale riga (del foglio di lavoro) una cella appartiene, dovremo usare la sua proprietà Row che restituisce il suo numero indice o numero di riga (o di colonna); se noi scriviamo:

  • nriga = ActiveCell.Row

  • nriga = Cells(x, y).Row

  • nriga = Range("A22").Row   ecc.

 con la variabile nriga otteniamo il numero della riga su cui la cella dell' esempio risiede (lo stesso sarà per le colonne se usiamo Column).

Sapendo quindi il numero di riga (e conoscendo anche il numero di colonna), possiamo puntare, mirare, riferirci ad una cella ben precisa, usando la sintassi Cells, che guarda caso, utilizza per identificare la cella, il numero di riga e il numero di colonna, separati dalla virgola; se infatti scriviamo Cells(2, 3) ci riferiamo alla cella che è nella riga 2,  colonna 3 (la C), alias riconoscibile anche come Range("C2").

Il vantaggio di usare la sintassi Cells(r, c) risiede nel fatto che è più semplice utilizzare "variabili" come riferimenti di riga e/o di colonna; se nell'esempio sopra, con nriga avessimo il numero 2, la sintassi Cells(nriga, 3) ci avrebbe portato alla cella C2.

Ora, come si fa a trovare la prima riga libera ? basta cercare l'ultima riga occupata, e aggiungere 1 al numero di riga trovato.

E come si fa a trovare l'ultima riga occupata ? intanto sfruttando la proprietà End. Non mi fate riscrivere tutto, andate a fà..un giretto sull'altro sito, e curiosate nell'articolo "Proprietà End"  http://ennius.interfree.it/vba/vba130.htm dove trovate , guarda caso, esempi sul reperimento delle righe libere.

oppure usando dei "cicli" che, iniziando da una riga nota, conosciuta, scorrano in genere verso il basso (ma possono scorrere in tutte le direzioni), cercando la prima cella vuota,  libera, in una colonna predefinita.

Una cella la possiamo definire libera, vuota,  anche dicendo che è diversa da occupata, giusto? E allora, se vogliamo cercare la prima cella libera nella colonna B (la 2), iniziando a cercare dalla riga 5, useremo un ciclo While...Wend che "giri", cioè cerchi un "qualcosa" fintantochè non lo trova ed esaurisce la ricerca: e cosa gli facciamo cercare? una cella che non sia occupata, una cella vuota.

  • nriga = 5
    While Cells(nriga, 2) <> ""
    nriga = nriga + 1
    Wend
    rigalibera = nriga

le istruzioni sopra non sono difficili: si usa una variabile (nriga) alla quale si assegna un valore (5); questo valore indica il numero di riga (del foglio di lavoro) da cui iniziare il ciclo, quindi si innesca un ciclo While che "gira" cioè si ripete fino a che si verifica la condizione che indichiamo, cioè : gira fino a che trovi la cella della colonna 2 (la B) numero riga rappresentato dalla variabile "nriga" (la numero 5, all'inizio) che è diversa (<>) da vuoto (""); se la riga del foglio letta in quel momento (la 5) risulta occupata (quindi diversa da vuoto) l'esecuzione delle istruzioni passa alla riga di codice successiva che aggiunge 1 (nriga = nriga + 1) alla variabile "nriga" facendola diventare 6, quindi passa alla riga di codice successiva dove trova l'istruzione Wend che provvede a rinviare a While l'esecuzione delle istruzioni; verrà quindi controllata la riga del foglio che ora è la 6, e così via fino a quando, incrementando di 1 (e quindi scorrendo verso il basso) verrà trovata la condizione in  cui nriga sarà vuota; a quel punto il ciclo termina, finisce, e però avremo che la variabile nriga corrisponderà alla prima cella libera trovata dopo la cella iniziale 5.

Un ciclo While...Wend quindi è molto pratico e utile per tutte quelle operazioni di copia/incolla con ricerca della prima riga libera, o per trasferimento di dati da textbox di userform, di cui facciamo un esempio: supponiamo di voler trasferire ciò che avremo scritto in tre textbox (TextBox1, 2, 3) poste su una userform. Nel CommandButton che useremo per lanciare l'istruzione di trasferimento dati, scriveremo:

  • nriga = 2
    While Cells(nriga, 3) <> ""
    nriga = nriga + 1
    Wend
    Cells(nriga, 3) = CStr(TextBox1)
    Cells(nriga, 4) = CDbl(TextBox2)
    Cells(nriga, 5) = CDate(TextBox3)

In genere molto spesso tutti i dati provenienti da textbox devono finire in tabelle di campi associati, quindi, trovata la prima riga libera nella colonna (d'esempio) 3, iniziando dalla riga (d'esempio) 2 con la variabile nriga, assegniamo ad altrettante colonne (la 3 la 4 e la 5), stessa riga di nriga, i valori che saranno nelle tre textbox; nell'esempio ho usato le "funzioni di conversione del tipo" per ricordare che è importante avvisare excel del "tipo di dati" che si stanno trasferendo.




 

prelevato sul sito www.ennius.altervista.org