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
|