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 : )
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/
"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
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
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
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
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
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.
> 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
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
"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
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
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.