Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

trasporre valori su righe in colonna da codice VB

3 views
Skip to first unread message

Gab58

unread,
Nov 14, 2007, 7:26:02 AM11/14/07
to
Uso excel 2003.
E' mio desiderio creare una routine in Excel che legga valori da una o più
righe selezionate e li trasponga in altrettante colonne. Esattamente quello
che fa "incolla speciale" spuntando "trasponi".

Dovendo farne un numero cospicuo di queste trasposizioni, desidero farsì che
questo venga eseguito da una routine all'interno di un foglio.
Forse è una cosa banale ma se qualcuno può aiutarmi...

Grazie : )

Mauro Gamberini

unread,
Nov 14, 2007, 9:48:54 AM11/14/07
to

I tuoi valori da trasporre nel Foglio1,
righe da 5 a 10.

Colonne in cui trasporre,
da H in poi.

E' chiaro che non puoi avere sulle righe valori oltre la colonna 7
(G), almeno nel mio esempio:

Public Sub m()

Dim uc As Long
Dim nr As Long
Dim nc As Long

nc = 8

With Worksheets("Foglio1")
For nr = 5 To 10
uc = .Cells(nr, Columns.Count).End(xlToLeft).Column
.Range(Cells(nr, 1), Cells(nr, uc)).Copy
.Cells(1, nc).PasteSpecial Paste:=xlPasteAll, _
Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
nc = nc + 1
Next
Application.CutCopyMode = False
End With

End Sub

--
---------------------------
Mauro Gamberini
http://www.riolab.org/


Antonio

unread,
Nov 14, 2007, 9:53:29 AM11/14/07
to

"Gab58" ha scritto:

Io non sono molto pratico di VB, ma hai provato con il registratore di macro?
Quello che chiedi mi sembra abbastanza semplice quindi dovrebbe bastarti,
attivi il registratore di macro, fai le operazioni Copi/Incolla speciale
Trasponi, all fine blocchi il registratore ed hai la macro pronta per essere
riutilizzata in altre occasioni.
Certo se le righe non sono sempre le stesse la cosa si complica ed in questo
caso non và bene il metodo che ti ho suggerito, occorre qualcosa di più
elaborato.

Ciao
Antonio

Bruno Campanini

unread,
Nov 14, 2007, 5:17:37 PM11/14/07
to
"Gab58" <Ga...@discussions.microsoft.com> wrote in message
news:9A71F5EC-0194-482B...@microsoft.com...

Sub Sheet4_Button2_Click()
Dim i, j
For Each i In Selection
j = j + 1
Range("R3")(, j) = i
Next
End Sub

Agisce su una selezione di righe trasponendo il tutto su
colonne contigue a partire da R3.

Bruno


Mauro Gamberini

unread,
Nov 15, 2007, 3:02:01 AM11/15/07
to
>> E' mio desiderio creare una routine in Excel che legga valori da una o
>> più
>> righe selezionate e li trasponga in altrettante colonne.

Ciao Bruno.
Io l'ho letta n righe da trasformare in n colonne.

Bruno Campanini

unread,
Nov 15, 2007, 4:54:38 AM11/15/07
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:O5I4U31J...@TK2MSFTNGP03.phx.gbl...

>>> E' mio desiderio creare una routine in Excel che legga valori da una o
>>> più
>>> righe selezionate e li trasponga in altrettante colonne.
>
> Ciao Bruno.
> Io l'ho letta n righe da trasformare in n colonne.

Anch'io! Perché c'è qualcosa che non va?
Se selezioni n righe ti traspone in n colonne.

Se selezioni n colonne - e togli la virgola dinanzi a j -
ti traspone in n righe.

Se selezioni una matrice anziché un vettore, ti traspone
il tutto in colonne o righe a seconda che esista o meno
la virgola prima della j.

Ciao
Bruno


Mauro Gamberini

unread,
Nov 15, 2007, 5:07:03 AM11/15/07
to
> Anch'io! Perché c'è qualcosa che non va?
> Se selezioni n righe ti traspone in n colonne.
>
> Se selezioni n colonne - e togli la virgola dinanzi a j -
> ti traspone in n righe.
>
> Se selezioni una matrice anziché un vettore, ti traspone
> il tutto in colonne o righe a seconda che esista o meno
> la virgola prima della j.
>

Ok. Così come era stata postata avevo tutte le
righe su di un unica riga.

Bruno Campanini

unread,
Nov 15, 2007, 6:48:03 AM11/15/07
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:u%234RG92J...@TK2MSFTNGP02.phx.gbl...

>> Anch'io! Perché c'è qualcosa che non va?
>> Se selezioni n righe ti traspone in n colonne.
>>
>> Se selezioni n colonne - e togli la virgola dinanzi a j -
>> ti traspone in n righe.
>>
>> Se selezioni una matrice anziché un vettore, ti traspone
>> il tutto in colonne o righe a seconda che esista o meno
>> la virgola prima della j.
>>
>
> Ok. Così come era stata postata avevo tutte le
> righe su di un unica riga.

Certo! n righe su un'unica riga equivale a dire
n righe su n colonne...

Bruno


Mauro Gamberini

unread,
Nov 15, 2007, 6:59:41 AM11/15/07
to
> Certo! n righe su un'unica riga equivale a dire
> n righe su n colonne...
>

Mi sa che non ci capiamo(immagino di essere io).

A B C
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3

Il transpose io lo intenderei cosě:

R S T
1 a1 a2 a3
2 b1 b2 b3
3 c1 c2 c3

Bah, scusa, non ha importanza comunque.

Bruno Campanini

unread,
Nov 15, 2007, 8:09:20 AM11/15/07
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:emmiB83J...@TK2MSFTNGP04.phx.gbl...

>> Certo! n righe su un'unica riga equivale a dire
>> n righe su n colonne...
>>
>
> Mi sa che non ci capiamo(immagino di essere io).
>
> A B C
> 1 a1 b1 c1
> 2 a2 b2 c2
> 3 a3 b3 c3
>
> Il transpose io lo intenderei cosě:
>
> R S T
> 1 a1 a2 a3
> 2 b1 b2 b3
> 3 c1 c2 c3
>
> Bah, scusa, non ha importanza comunque.

Hai detto benissimo!
Son io ad aver inteso troppo semplicemente da:
1
2
3

a:
1 2 3

Trattandosi di trasporre un Array e non un Vettore:

Sub Sheet4_Button2_Click()
Dim i, j

For i = 1 To Selection.Rows.Count
For j = 1 To Selection.Columns.Count
Range("R3")(j, i) = Selection(i, j)
Next
Next
End Sub

Bruno


Mauro Gamberini

unread,
Nov 15, 2007, 8:38:02 AM11/15/07
to
> Hai detto benissimo!
> Son io ad aver inteso troppo semplicemente da:
> 1
> 2
> 3
>
> a:
> 1 2 3
>
> Trattandosi di trasporre un Array e non un Vettore:
>
> Sub Sheet4_Button2_Click()
> Dim i, j
> For i = 1 To Selection.Rows.Count
> For j = 1 To Selection.Columns.Count
> Range("R3")(j, i) = Selection(i, j)
> Next
> Next
> End Sub
>

Ecco, ok.
Faccio due prove per vedere quale
metodo è più veloce,
se il tuo o il primo postato da me.
Solo per sfizio.
Grazie Bruno.

Bruno Campanini

unread,
Nov 15, 2007, 10:02:13 AM11/15/07
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:uXLo%23y4JI...@TK2MSFTNGP02.phx.gbl...

> Ecco, ok.
> Faccio due prove per vedere quale
> metodo è più veloce,
> se il tuo o il primo postato da me.
> Solo per sfizio.
> Grazie Bruno.

Il tuo è senz'altro più veloce, ma il mio è più bello...

Comunque attendo responso, ché son curioso!

Ciao
Bruno


Mauro Gamberini

unread,
Nov 15, 2007, 11:32:42 AM11/15/07
to
> Il tuo è senz'altro più veloce, ma il mio è più bello...
>
> Comunque attendo responso, ché son curioso!
>

Foglio1 con dati in A2:J100
da transporre a partire da DF1.

Entrambe veloci. La tua(scusa ma se
non dichiaro le variabili qui non gira), questa:

Public Sub b()

Dim i As Long
Dim j As Long

Application.ScreenUpdating = False

With Worksheets("Foglio1")
.Range("A2:J100").Select


For i = 1 To Selection.Rows.Count
For j = 1 To Selection.Columns.Count

Range("DF1")(j, i) = Selection(i, j)
Next
Next
Application.ScreenUpdating = True
.Cells(1, 110).Select
End With

End Sub

è *più veloce* della mia, questa:

Public Sub m()

Dim uc As Long
Dim nr As Long
Dim nc As Long

nc = 110

Application.ScreenUpdating = False

With Worksheets("Foglio1")
For nr = 2 To 100


uc = .Cells(nr, Columns.Count).End(xlToLeft).Column
.Range(Cells(nr, 1), Cells(nr, uc)).Copy
.Cells(1, nc).PasteSpecial Paste:=xlPasteAll, _
Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
nc = nc + 1
Next
Application.CutCopyMode = False

Application.ScreenUpdating = True
.Cells(1, 110).Select
End With

End Sub

(siamo sempre sotto al secondo nel mio pc).

Questa però, un fulmine, istantanea, non c'è paragone:

Public Sub mb()

Application.ScreenUpdating = False

With Worksheets("Foglio1")
.Range("A2:J100").Copy
.Range("DF1").PasteSpecial Paste:=xlPasteAll, _


Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True

Application.CutCopyMode = False
Application.ScreenUpdating = True
.Cells(1, 110).Select
End With

End Sub

eliano

unread,
Nov 15, 2007, 12:56:02 PM11/15/07
to

"Mauro Gamberini" ha scritto:

> > Il tuo è senz'altro più veloce, ma il mio è più bello...
> >
> > Comunque attendo responso, ché son curioso!
> >
>
> Foglio1 con dati in A2:J100
> da transporre a partire da DF1.
>
> Entrambe veloci. La tua(scusa ma se
> non dichiaro le variabili qui non gira), questa:
>
> Public Sub b()

> ............


> End Sub
>
> è *più veloce* della mia, questa:
>
> Public Sub m()

> ............
> End Sub


>
> Questa però, un fulmine, istantanea, non c'è paragone:
>
> Public Sub mb()

> ... Copy...Traspose
> End Sub
>

Bella forza, Mauro; usare le "interiora" di excel contro iterazioni
varie&diverse sarebbe come andare a Monza con una 500 ed avere delle pretese.
L'intento è chiaramente provocatorio, per cui non VI alterate, grazie.:-))
Credo che siano passati 6 mesi dall'ultima volta che ho visto misurare dei
tempi di esecuzione; della serie non è mai troppo tardi.:-))
Ciao Mauro, ciao Bruno, a domani
Eliano

Bruno Campanini

unread,
Nov 17, 2007, 6:33:49 AM11/17/07
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:Ozq65U6J...@TK2MSFTNGP04.phx.gbl...

>> Il tuo è senz'altro più veloce, ma il mio è più bello...
>>
>> Comunque attendo responso, ché son curioso!
>>
>
> Foglio1 con dati in A2:J100
> da transporre a partire da DF1.
>
> Entrambe veloci. La tua(scusa ma se
> non dichiaro le variabili qui non gira), questa:
[...]

Prova così:
=====================================
Dim i, j, RRange As Range, T As Double
Set RRange = [Sheet4!A1:J100]
T = Timer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For i = 1 To RRange.Rows.Count
For j = 1 To RRange.Columns.Count
Range("U1")(j, i) = RRange(i, j)


Next
Next
Application.ScreenUpdating = True

Application.Calculation = xlCalculationAutomatic
MsgBox Timer - T
======================================

Da me il tempo è sui 5/100 di secondo e non rilevo alcuna
differenza definendo i, j Long piuttosto che Variant.

Bruno


Mauro Gamberini

unread,
Nov 19, 2007, 3:12:09 AM11/19/07
to
> Da me il tempo è sui 5/100 di secondo e non rilevo alcuna
> differenza definendo i, j Long piuttosto che Variant.
>

Neppure io. Per correttezza però,
definisco sempre il tipo. Vb(vba) sono
molto *buoni*. Vb.net e C# cose
di questo genere non le permettono.

Fossimo in vb e trasponessimo una matrice
adotterei senza dubbio la tua soluzione.
In Excel, preferisco però la funzionalità
nativa.

Grazie per la discussione. Qui oramai non si
discute più. Si postano sempre le stesse soluzioni
modificando 2 parametri.

0 new messages