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

#6 Héctor Miguel
23/08/2009 - 19:30 | Informe spam
hola, ?

El codigo 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 tamano, supongo por la instruccion 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 pequeno detalle, es mas facil borrar las filas sobrantes de la columna a en la sheet2.
Muchisimas gracias, tu ayuda me ha sido de gran utilidad
PD Hay una palabra en espanol para Transpose



1) la instruccion (Cols = Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1) lo que hace es:
"contar" cuantas celdas (de cada fila) contienen algun dato entre las columnas A:O (15 columnas segun tu consulta original)
lo anterior, "asumiendo" que las que no contengan datos "validos" estan vacias (cosa que he tenido que suponer) -???-

a) si en la realidad 15 no es el "limite" (?), modifica el .Resize(, 15) <-> por .Resize(, 18)
incluso, si no estas seguro de que 18 si sea el limite, cambia el .Resize(...) <-> por un .EntireRow

b) si en la realidad, las celdas que no contengan datos "validos" NO estan vacias, si no que usas un =si(...,..,"")
cambia la funcion CountA <-> por un Count (que solo cuenta numeros)

2) segun los supuestos anteriores, (si estoy correcto y las celdas estan vacias)...
no hay forma de que la transposicion sea siempre "del mismo tamano" (salvo, como comento, si NO estan vacias) -???-

3) en cuanto a la palabra "en espanol" para transpose... (y segun la RAE), consulta:
http://buscon.rae.es/draeI/SrvltCon...transponer
luego pulsa en el boton "conjugar" (ya despues podras comprobar que no existen "transposar" ni "trasposar")

saludos,
hector.

(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 ?
Respuesta Responder a este mensaje
#7 sebastico
24/08/2009 - 03:15 | Informe spam
Héctor Miguel

Hay celdas con 18 campos con datos pero otras sin datos. Sin lugar a dudas
esto es lo que debo modificar según tus sugerencias.

En cuanto a Transpose, supuse que la comunidad en español ya usaba alguna
palabra en español.

Una vez más, muchas gracias por tu valiosa ayuda

Salud2

"Héctor Miguel" wrote:

hola, ?

> El codigo 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 tamano, supongo por la instruccion 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 pequeno detalle, es mas facil borrar las filas sobrantes de la columna a en la sheet2.
> Muchisimas gracias, tu ayuda me ha sido de gran utilidad
> PD Hay una palabra en espanol para Transpose

1) la instruccion (Cols = Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1) lo que hace es:
"contar" cuantas celdas (de cada fila) contienen algun dato entre las columnas A:O (15 columnas segun tu consulta original)
lo anterior, "asumiendo" que las que no contengan datos "validos" estan vacias (cosa que he tenido que suponer) -???-

a) si en la realidad 15 no es el "limite" (?), modifica el .Resize(, 15) <-> por .Resize(, 18)
incluso, si no estas seguro de que 18 si sea el limite, cambia el .Resize(...) <-> por un .EntireRow

b) si en la realidad, las celdas que no contengan datos "validos" NO estan vacias, si no que usas un =si(...,..,"")
cambia la funcion CountA <-> por un Count (que solo cuenta numeros)

2) segun los supuestos anteriores, (si estoy correcto y las celdas estan vacias)...
no hay forma de que la transposicion sea siempre "del mismo tamano" (salvo, como comento, si NO estan vacias) -???-

3) en cuanto a la palabra "en espanol" para transpose... (y segun la RAE), consulta:
http://buscon.rae.es/draeI/SrvltCon...transponer
luego pulsa en el boton "conjugar" (ya despues podras comprobar que no existen "transposar" ni "trasposar")

saludos,
hector.

>> (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 ?



Respuesta Responder a este mensaje
#8 Héctor Miguel
24/08/2009 - 04:21 | Informe spam
hola, !

En cuanto a Transpose, supuse que la comunidad en espanol ya usaba alguna palabra en espanol...



bueno... (en realidad, no se a que te refieres con esa suposicion, pero...)
si utilizas un traductor ingles-espanol obtienes lo siguiente:
transpose <-> transponga
transposed <-> transpuesto

(?)

saludos,
hector.
Respuesta Responder a este mensaje
#9 sebastico
24/08/2009 - 21:26 | Informe spam
Hola Héctor Miguel

Otro favor.

He tratado de corregir el código con tus sugerencias, para que el programa
ordene los datos en columnas A y B del Sheet 1según me deseo, pero, he
fracasado.
Incluso el código no lee las primeras dos filas de la Sheet1. Debo decir que
en el Sheet1 hay filas que tienen solo un dato (string), otras 5, etc y otras
hasta 18, el número es variable.

Es mi deseo solucionar el inconveniente que tengo para que solo copie las
filas que tienen datos.

En primer lugar no entiendo bien las instrucciones. Me podrías ayudar a
describir que hace cada instrucción, las cuales he numerado.

Sub Copiar_transpuesto()
1) Dim Fila As Integer, Cols As Byte, nFila As Integer

2)Application.ScreenUpdating = False
¿Qué significa?

3)With Worksheets("sheet1")
En la Hoja1

4)For Fila = 1 To 631
Para la Fila de la 1 a la Fila 631

5)Cols = Application.CountA(.Range("a" & Fila + 1).Resize(, 15)) - 1
contar" cuantas celdas (de cada fila) contienen algun dato entre las
columnas A:O (15 columnas. Que significado tienen las instrucciones entre
paréntesis, el &, el .CountA, el .Resize

5)nFila = Worksheets("sheet2").Range("a65536").End(xlUp).Row - (3 * (nFila >
1))
¿Qué significa toda la instrucción?

6)Worksheets("sheet2").Range("a" & nFila).Resize(Cols).Value = _
.Range("a" & Fila + 1).Value
¿Qué significa?

7)Worksheets("sheet2").Range("b" & nFila).Resize(Cols).Value = _
Application.Transpose(.Range("b" & Fila + 1).Resize(, Cols).Value)
¿Qué significa?

8)Next
End With
End Sub

Muchas gracias


"Héctor Miguel" wrote:

hola, !

> En cuanto a Transpose, supuse que la comunidad en espanol ya usaba alguna palabra en espanol...

bueno... (en realidad, no se a que te refieres con esa suposicion, pero...)
si utilizas un traductor ingles-espanol obtienes lo siguiente:
transpose <-> transponga
transposed <-> transpuesto

(?)

saludos,
hector.



Respuesta Responder a este mensaje
#10 Héctor Miguel
25/08/2009 - 06:55 | Informe spam
hola (...), ?????

__ 1 __
He tratado de corregir el codigo con tus sugerencias, para que el programa
ordene los datos en columnas A y B del Sheet1 segun me deseo, pero, he fracasado.
Incluso el codigo no lee las primeras dos filas de la Sheet1.



1) antes de todo, considera que aun hay dos o tres (re)preguntas a las que no has dado respuesta (p.e.)
- cuando hay menos columnas, la columnas "no necesarias" estan REALMENTE vacias ???
- que significa "ordenar los datos" en las columnas A y B del "Sheet1" ???

__ 2 __
Debo decir que en el Sheet1 hay filas que tienen solo un dato (string), otras 5, etc y otras hasta 18, el numero es variable.
Es mi deseo solucionar el inconveniente que tengo para que solo copie las filas que tienen datos.



2) (creo que) esta parte es similar al primer apartado del punto anterior (me explico)
que es lo que determina si alguna fila (de la sheet1) tiene datos o no ???

__ 3 __
... no entiendo bien las instrucciones. Me podrias ayudar a describir que hace cada instruccion, las cuales he numerado...



3) me gustaria (de ser posible) que primero dejes claras "mis dudas" comentadas en este y anteriores mensajes (???)

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida