Eliminare righe : cosa succede? - pagina vista: volte

Credo che prima o poi ogni utente di excel provi o abbia provato ad eliminare righe intere da un foglio di lavoro e sappiamo che excel inserisce automaticamente una nuova riga che prenderà il posto, o meglio il numero riga di quella eliminata; ma come avviene la sostituzione? Excel scala verso l'alto le rimanenti righe e inserisce la nuova riga all'indice 65536, cioè all'ultima riga; contemporaneamente riallinea gli indici di riga; in pratica quindi, se si è eliminata la riga 10, la nuova riga 10 altro non è che la riga 11 scalata verso l'alto e rinominata.

Quando si siano impostate celle con formule o funzioni che fanno uso di riferimenti alle celle, nel caso di una eliminazione di una riga lo stesso excel provvede a ricalcolare e correggere i riferimenti preimpostati nelle formule, ma non succede altrettanto ad istruzioni vba che Excel non può modificare.

Questo breve articolo non vuole insegnare come fare e rendere variabili i riferimenti, esistono sul sito più articoli in proposito, ma vuole evidenziare quanto sia errato il concetto di "recupero" del o dei numeri di riga eliminate, rispetto ad una situazione antecedente l'eliminazione.

Per mostrare quanto detto ci avvaliamo di una semplice routine che, posto un breve ciclo For... Next con passo 2, eliminerà una riga si e una no, e mostrerà cosa si elimina in realtà. Nell'immagine sotto ho evidenziato (frecce) l'intervallo dalla riga 4 alla riga 10, ed ho marcato le righe 4,6,8,10. Usiamo la routine FammiVedere dove si inizia un ciclo che parte dalla riga 4 e saltando di due in due (Step2) colorerà la riga letta nel ciclo di rosso, ci avviserà con un  messaggio della riga che stiamo eliminando, e del valore posto nella cella A, stessa riga, quindi dopo che avremo premuto OK sulla messagebox, le istruzioni elimineranno la riga e continueranno il ciclo fino alla riga 10.

Se eliminassimo veramente le righe 4, 6, 8, e 10 anche i valori letti nelle corrispondenti celle A stessa riga, dovrebbero coincidere...

Sub FammiVedere()
For n = 4 To 10 Step 2
Rows(n).Interior.ColorIndex = 3
MsgBox "Sto eliminando la riga " & n & " che prima era la riga " & Cells(n, 1)
Rows(n).Delete
Next
End Sub

invece.... vediamo una sequenza dei quattro cicli:

   
   
   

ad inizio ciclo è tutto regolare, viene eliminata la riga 4, ma appena eliminata e, prima del ciclo successivo, excel ne rigenera una, la fa scalare dall'estremo del foglio verso l'alto al posto di quella tolta, e continua così fino alla fine del ciclo: ma cosa è successo? i contenuti sono cambiati, o meglio, il contenuto delle celle che prima si trovavano su un determinato indice riga, ora non lo sono più e sono sfalsati rispetto a prima. Si dirà: certo, è normale, ad ogni riga eliminata, si scala verso l'alto la riga sottostante che ora prende il posto di quella eliminata, e quindi anche il contenuto; ok, basta solo ricordarlo.

Conclusione: l'esercizio vuole solo mettere in guardia i lettori nel porre attenzione quando si usino istruzioni vba che mirino a valori posti in determinate celle (quindi determinate righe) e che per effetto di eliminazione di righe si ritroveranno su indirizzi diversi. Lettore avvisato...

 

buon lavoro.

prelevato sul sito www.ennius.altervista.org