Bucle para Copiar, pegar con Transpose

23/08/2009 - 05:04 por sebastico | Informe spam
Hola amigos

He encontrado el siguiente código que me permite copiar y ejecutar la
función transpose con miles de datos.

Option Explicit
Sub testme()
Dim wks As Worksheet
Dim DestCell As Range
Dim iRow As Long

Set wks = Worksheets("Sheet1") ' or ActiveSheet

Set DestCell = Worksheets("Sheet2").Range("a1")

With wks
For iRow = 2 To 632
' or last used cell in column A
'for irow = 2 to .Cells(.Rows.Count, "A").End(xlUp).Row
.Cells(iRow, "A").Resize(1, .Range("o1").Column).Copy
DestCell.PasteSpecial _
Paste:=xlPasteAll, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=True
Set DestCell = DestCell.Offset(18, 0)
Next iRow
End With
End Sub

Ese código ordena todos los datos en una sola columna. Sin embargo, debido a
que no se como indicar que solo copie las celdas con datos, el código recorre
las 18 celdas de cada fila con o sin datos (creo que lo hace con .Cells(iRow,
"A").Resize(1, .Range("o1").Column).Copy ), y las copia y pega con el
trasnpose en las 18 celdas de otra columna (con Set DestCell =
DestCell.Offset(18, 0) ).

Desafortunadamente para mi, colocar a mano la primera celda como código
identificador en la celda de la columna contigua me lleva, también, mucho
trabajo y tiempo.

Como lo indico el rango de fila es diferente por ejemplo:

Fila A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1 01
Datos 1 4 2 1 8 6 9 2 4 7 1 8 5 1 3

Fila A2 B2 C2 D2 E2 F2 G2 H2 J1
Datos 3 2 7 5 1 4 8 1 5
.
.
.
A107 B107
4 7
.
.
A632 B632 C632 D632 E532
6 9 2 7 5

Necesito que al correr el código con la instrucción que busco con la ayuda
de ustedes, el TRANSPOSE ordene las filas asi:

A B
1 4
1 4
1 2
1 1
1 8
1 6
1 9
1 2
1 4
1 7
1 1
1 8
1 5
1 1
1 3

A B
3 2
3 2
3 7
3 5
3 1
3 4
3 8
3 1
3 5

A B
4 7

A B
6 9
6 2
6 7
6 5


Hasta copiar la fila 631. Obsérvese que la primera celda de cada fila se
copia en las celdas de la columna contigua en este caso en A.

Podrian sugerirme que hacer pues acomodar los datos a mano me lleva más de
un dia y puedo cometer errores, como ya lo he comprobado.

Muchas gracias y Salud2

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
23/08/2009 - 05:48 | Informe spam
hola (...), ?????

por que no pruebas con "la otra" propuesta a tu consulta original ("ciclo con transpose") ?

saludos,
hector.
Respuesta Responder a este mensaje
#2 sebastico
23/08/2009 - 08:23 | Informe spam
Hola Hector Miguel
Ya lo probé u funciona igual que el otro, pero, es es mas rápido. Sin
embargo, al igual que aquel ordena todos los registro en una sola columna y
no coloca el primer registro al lado, como lo necesito.

Ahora lo que tengo que hacer (a mano) es insertar una columna la izquierda
(que será la A), cortar el primer registro de cada Transpose de la columna B
y copiarlo al lado de cada registro de la columna A producto del código que
me sugeriste.

De nuevo, muchas gracias por tu atención

Salud2
"Héctor Miguel" wrote:

hola (...), ?????

por que no pruebas con "la otra" propuesta a tu consulta original ("ciclo con transpose") ?

saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
23/08/2009 - 08:38 | Informe spam
hola (...), ?????

Ya lo probe u funciona igual que el otro, pero, es es mas rapido.
... al igual que aquel ordena todos los registro en una sola columna y no coloca el primer registro al lado, como lo necesito.



esta parte no lo habias comentado en aquella consulta...
que significa (exactamente) "el primer registro al lado" ???

Ahora lo que tengo que hacer (a mano) es insertar una columna la izquierda (que sera la A)
cortar el primer registro de cada Transpose de la columna B y copiarlo al lado de cada registro de la columna A ...



(otra vez...) me quedo "medio perdido"...
1) donde necesitas (en la "sheet2") a transposicion de los datos (de la "sheet1") => en la columna A o en la B (???)
2) en caso de ser la columna B... que es (exctamente) lo que necesitas "registrar" en la columna A (???)

-> quieres decir que NO TODAS las filas de la "sheet1" tienen datos en las columnas [A:O] ???
y (pareciera que) lo que buscas es "numerar" (en la "sheet2") de cual fila (#) vienen los datos transpuestos ???

saludos,
hector.
Respuesta Responder a este mensaje
#4 Héctor Miguel
23/08/2009 - 09:07 | Informe spam
hola (de nuevo), !

(a ver si entendi bien...)

prueba con las siguientes modificaciones a la macro de la propuesta anterior...

Sub Copiar_transpuesto()
Dim Fila As Integer, Cols As Byte, nFila As Integer
Application.ScreenUpdating = False
With Worksheets("sheet1")
For Fila = 1 To 631
Cols = Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1
nFila = Worksheets("sheet2").Range("a65536").End(xlUp).Row - (3 * (nFila > 1))
Worksheets("sheet2").Range("a" & nFila).Resize(Cols).Value = _
.Range("a" & Fila + 1).Value
Worksheets("sheet2").Range("b" & nFila).Resize(Cols).Value = _
Application.Transpose(.Range("b" & Fila + 1).Resize(, Cols).Value)
Next
End With
End Sub

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#5 sebastico
23/08/2009 - 13:21 | Informe spam
Hector Miguel

El código coloca la primera celda de la columna B en la primera celda de la
columna A para cada fila "transposada", tal y como lo deseado. Empero, las
hace del mismo tamaño, supongo por la instrucción Cols =
Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1. Como indico las
filas a "transposar: del sheet1 tienen rangos diferentes (entre 1 y 18).

A pesar de este pequeño detalle, es mas facil borrar las filas sobrantes de
la columna a en la sheet2.

Muchísimas gracias, tu ayuda me ha sido de gran utilidad

PD Hay una palabra en español para Transpose

Salud2

"Héctor Miguel" wrote:

hola (de nuevo), !

(a ver si entendi bien...)

prueba con las siguientes modificaciones a la macro de la propuesta anterior...

Sub Copiar_transpuesto()
Dim Fila As Integer, Cols As Byte, nFila As Integer
Application.ScreenUpdating = False
With Worksheets("sheet1")
For Fila = 1 To 631
Cols = Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1
nFila = Worksheets("sheet2").Range("a65536").End(xlUp).Row - (3 * (nFila > 1))
Worksheets("sheet2").Range("a" & nFila).Resize(Cols).Value = _
.Range("a" & Fila + 1).Value
Worksheets("sheet2").Range("b" & nFila).Resize(Cols).Value = _
Application.Transpose(.Range("b" & Fila + 1).Resize(, Cols).Value)
Next
End With
End Sub

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida