Copiare un Range di celle (3 righe) e incollare trasponendo.  - dal 04/09/04 pagina vista: volte

Questo esercizio è dedicato al Copia/Incolla di dati contenuti in elenchi su unica colonna, ma i cui dati, disposti su righe multiple, li si voglia organizzare in elenchi con dati disposti su più colonne, in unica riga per ogni groppo di dati. Forse è meglio vedere cosa si intende:

in questa immagine vediamo un elenco di tre dati diversi, che si ripetono a scendere a gruppi di tre in tre, ognuno dei quali identifica : un nominativo, il suo indirizzo, il suo telefono:

e vogliamo copiare tre righe per volta (nominativo, indirizzo, telefono) e costruire su un altro foglio, un elenco basato su tre colonne, così:

Questo è il caso in cui si deve adoperare l'opzione "Trasponi" nell'incollare i dati; opzione che consente di incollare in "orizzontale" ciò che è stato copiato in "verticale" (e viceversa). In questi casi, per incollare, è sufficiente indicare una sola cella di destinazione, perchè Excel disponga i dati in tante colonne conseguenti, per quante righe sono state copiate. Ma vediamo come operare:

  • determinare quanto è lungo l'elenco da copiare.

  • memorizzare da quante righe è composto.

  • creare un ciclo For..Next che "spazzoli" tutto l'elenco "saltando" di tre righe in tre righe (con Step 3)

  • selezionare la riga in quel momento "contata" (nominativo) insieme alle due righe successive (indirizzo e telefono).

  • copiare la selezione fatta.

  • spostarsi sul foglio di destinazione.

  • cercare nella colonna voluta (la A nell'esempio, quindi la 1), la prima cella vuota e lì incollare i dati, usando l'opzione "Transpose = True" per effettuare la trasposizione.

  • ritornare sul foglio con l'elenco d'origine e continuare con Next, di tre righe in tre righe, fino alla fine dell'elenco.

Vediamo le istruzioni. Sono state anche inserite a inizio e fine routine, le istruzioni per misurare quanto tempo impiega tutta la routine ad essere eseguita. Una curiosità che potrà soddisfare tutti coloro che eseguiranno la macro con elenchi lunghi migliaia di dati. In un Pentium4, a 2400 Mhz, per eseguire l'operazione con 5001 righe, sono stati impiegati 24 secondi.

Sub MacroMia()
Dim D1, D2 As Date
'dichiarazione variabili come tipo di Date/Time per D1 e D2
Dim tempoimpiegato As String
' tempoimpiegato è una stringa
D1 = Time
Application.ScreenUpdating = False
'evita il saltellamento a schermo

Set zona = Range(Range("A1"), Range("A1").End(xlDown))
'impostiamo con "zona" i 'riferimenti alla cella iniziale (A1) e a quella finale (A1.End)
cont = zona.Rows.Count
'indi con "cont" si prende il totale delle righe interessate
For N = 1 To cont Step 3 
 'si inizia il ciclo da 1 fino al numero "cont", con passo 3
If Worksheets("Foglio1").Cells(N, 1) <> "" Then 
'se la cella riga N, col. 1 contiene dati
Range(Cells(N, 1), Cells(N + 2, 1)).Select 
'si selezionano tre righe
Selection.Copy 
'si copia la selezione dei valori contenuti nelle tre righe

Worksheets("Foglio2").Select
'e si passa al foglio destinazione
Dim iRow As Integer
iRow = 1
 'si imposta l'avvio indicando da quale riga iniziare (dalla riga 1)
While Cells(iRow, 1).Value <> ""
'si inizia il ciclo While...Wend cercando una cella vuota
iRow = iRow + 1 
 ' si incrementa di una riga ad ogni ciclo
Wend
Cells(iRow, 1).Select
'trovata la cella vuota, si seleziona e s'incollano i dati copiati
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
End If
Worksheets("Foglio1").Select
 'si ritorna sul foglio con l'elenco di partenza
Next 
'e si continua alla terza riga successiva, fino alla fine elenco
Application.CutCopyMode = False
 'si elimina il tratteggio sulle celle copiate

D2 = Time
'assegnazione a D2 del tempo in chiusura (termine) macro
tempoimpiegato = Format(D2 - D1, "hh:mm:ss")
' Assegnazione a tempoimpiegato della 'differenza tra D2 e 'D1 e formattazione nel formato ora-minuti-secondi
MsgBox "Tempo impiegato: " & tempoimpiegato
' messaggio finale del tempo trascorso

End Sub

Questa routine si presta ovviamente a molti utilizzi, purchè i dati da copiare siano organizzati in gruppi di righe costanti, si potrà, modificando il valore relativo allo Step del ciclo For..Next, decidere di quante righe eseguire il "salto" nello "spazzolamento", modificando adeguatamente anche il numero di righe da selezionare per essere copiate. Se i dati fossero in gruppi di 5 (con in più città e Cap relativi al nominativo, ad esempio), diventerebbero:

  • Step 5 (anzichè Step 3)

  • Range(Cells(N, 1), Cells(N + 4, 1)).Select  (anzichè Range(Cells(N, 1), Cells(N + 2, 1)).Select )

Queste non sono le uniche routine che si possono impostare, ma io ve le presento così.

Buon Lavoro.

prelevato sul sito www.ennius.altervista.org