Automatizaremos hoy, mediante una macro, un proceso que transponga nuestros datos de vertical a horizontal según los diferentes cambios o saltos que se produzcan en uno de los campos.
Veamos un ejemplo donde aclarar la misión del día. En el listado siguiente tenemos tres campos, en los que el primero de ellos tiene agrupados los diferentes Códigos, y para código se detallan un número indeterminado de elementos en el campo DETALLE::
El objetivo es llegar a:
El objetivo queda algo más claro ahora, debemos conseguir transponer los valores del DETALLE para cada cambio en el CÓDIGO.
Así añadiremos nuestro código, macro Transponer, en un módulo de nuestro proyecto VBA:
Tras ejecutar nuestra macro, observaremos que por cada cambio o salto en el campo CÓDIGO se transponen los diferentes valores asociados a ese CÓDIGO para el campo DETALLE, independientemente del número de elementos para cada Código.
Veamos un ejemplo donde aclarar la misión del día. En el listado siguiente tenemos tres campos, en los que el primero de ellos tiene agrupados los diferentes Códigos, y para código se detallan un número indeterminado de elementos en el campo DETALLE::
El objetivo es llegar a:
El objetivo queda algo más claro ahora, debemos conseguir transponer los valores del DETALLE para cada cambio en el CÓDIGO.
Así añadiremos nuestro código, macro Transponer, en un módulo de nuestro proyecto VBA:
Sub Transponer() Dim fila As Long, filaN As Long, columna As Long 'seleccionamos la hoja con el orgien de datos Sheets("hoja2").Select Set miRango = Sheets("Hoja2").Range("B2:B41") A = Application.WorksheetFunction.CountA(miRango) fila = 1 'CÓDIGO Hoja4.Range("A1").Value = Hoja2.Range("B1").Value 'CLIENTE Hoja4.Range("B1").Value = Hoja2.Range("C1").Value 'DETALLE Hoja4.Range("C1").Value = Hoja2.Range("D1").Value 'definimos punto de partida para recorrer celdas filaN = 1: columna = 2 'hacemos un loop para pasar por todos los registros For i = 1 To A fila = fila + 1 'cuando el Código sea el mismo que el anterior If Hoja2.Range("B" & fila) = Hoja2.Range("B" & fila - 1) Then 'nos desplazamos una columna a la izquierda columna = columna + 1 Hoja4.Cells(filaN, columna).Offset(0, 1).Value = Hoja2.Cells(fila, 4).Value Else 'si no es el mismo, plasmamos los valores correspondientes filaN = filaN + 1 Hoja4.Cells(filaN, 1).Value = Hoja2.Cells(fila, 2) Hoja4.Cells(filaN, 2).Value = Hoja2.Cells(fila, 3) Hoja4.Cells(filaN, 3).Value = Hoja2.Cells(fila, 4) 'fijamos de nuevo para la comparativa a la columna B columna = 2 End If Next i 'liberamos la variable Set miRango = Nothing End Sub
Tras ejecutar nuestra macro, observaremos que por cada cambio o salto en el campo CÓDIGO se transponen los diferentes valores asociados a ese CÓDIGO para el campo DETALLE, independientemente del número de elementos para cada Código.
No me sirve el codigo, me puede ayudar por favor.
ResponderEliminarEste es el código para Excel 2013 en adelante.
ResponderEliminarSub Macro1()
Dim fila As Long, filaN As Long, columna As Long
'seleccionamos la hoja con el orgien de datos
Sheets("hoja2").Select
Set miRango = Sheets("Hoja2").Range("B2:B41")
A = Application.WorksheetFunction.CountA(miRango)
fila = 1
'CÓDIGO
Worksheets("Hoja4").Range("A1").Value = Worksheets("Hoja2").Range("B1").Value
'CLIENTE
Worksheets("Hoja4").Range("B1").Value = Worksheets("Hoja2").Range("C1").Value
'DETALLE
Worksheets("Hoja4").Range("C1").Value = Worksheets("Hoja2").Range("D1").Value
'definimos punto de partida para recorrer celdas
filaN = 1: columna = 2
'hacemos un loop para pasar por todos los registros
For i = 1 To A
fila = fila + 1
'cuando el Código sea el mismo que el anterior
If Worksheets("Hoja2").Range("B" & fila) = Worksheets("Hoja2").Range("B" & fila - 1) Then
'nos desplazamos una columna a la izquierda
columna = columna + 1
Worksheets("Hoja4").Cells(filaN, columna).Offset(0, 1).Value = Worksheets("Hoja2").Cells(fila, 4).Value
Else
'si no es el mismo, plasmamos los valores correspondientes
filaN = filaN + 1
Worksheets("Hoja4").Cells(filaN, 1).Value = Worksheets("Hoja2").Cells(fila, 2)
Worksheets("Hoja4").Cells(filaN, 2).Value = Worksheets("Hoja2").Cells(fila, 3)
Worksheets("Hoja4").Cells(filaN, 3).Value = Worksheets("Hoja2").Cells(fila, 4)
'fijamos de nuevo para la comparativa a la columna B
columna = 2
End If
Next i
'liberamos la variable
Set miRango = Nothing
End Sub
Hola Álvaro,
Eliminarqué no te funciona??
Parece que el código es el mismo que el del post???
Saludos
La "Hoja4" es donde se quiere ubicar la nueva tabla?
EliminarMe sale este error
Eliminar"Se ha producido el error '424' en tiempo de ejecución:
Se requiere un objeto"
Hola,
Eliminarte has asegurado que existe una hoja que se llama exactamente 'Hoja4' ??
Slds
Hola, no entiendo bien la programacion por lo que no puedo adaptarlo a mi necesidad.
ResponderEliminarTengo lo siguiente:
Nombre de la persona // Descripcion
LEONARDO HOLA123
LEONARDO CHAU123
MATIAS XXX
LAURA YYY
LAURA ZZZ
y quiero que por cada nombre me transponga las descripciones
o sea
LEONARDO HOLA123 CHAU 123
MATIAS XXX
LAURA YYY ZZZ
Hola,
Eliminarsolo adapta tus columnas a lo expuesto en el post... creo te valdría exactamente tal cual, ya que el código se basa en la comparativa de un campo (en tu caso el Nombre) para extenderlo horizontalmente...
¿cuál es la duda concreta que tienes entonces?
Saludos
Me sirvió muchísimo....muchas gracias!!!!
ResponderEliminar;-)
Eliminargracias!
Hola me aparece error 9 que debo hacer
ResponderEliminarHola,
Eliminarasegúrate existe la hoja con el nombre que estás empleando...
Saludos
Hola!
ResponderEliminarTengo una Hoja que posee 11 columnas con N filas, éstas poseen en común el dato en la columna 1; se requiere dejar X filas según los distintos criterios de la columna 1, y el resto de las filas deben colocarse en secuencia (de 10 en 10) en columnas. Cómo lo hago?
Saludos y gracias!
Hola Rodolfo,
Eliminarquizá este otro post te de la pista
https://excelforo.blogspot.com/2011/09/vba-como-insertar-filas-el-metod-insert.html
básicamente consistirá en desarrollar una macro con un bucle que recorra las N filas, empezando desde abajo, añadiendo el número de filas (X) que correspondan según esos criterios que mencionas...
Espero te oriente
Slds
Hola Ismael, te he enviado un correo con un archivo para ver si puedes ayudarme con un caso de transponer datos tomando en cuenta un texto especifico.
ResponderEliminarSaludos.
Hola
Eliminarte he contestado por email...
Saludos
Hola Ismael, en mi caso tengo un grupo de 6 filas que corresponden a 6 parámetros, este grupo es un tipo de equipo, pero después tengo otro equipo con otras 6 filas que son los mismos parámetros del otro modelo, como puedo modificar tu macro? pq ya he intentado de varias formas y no me sale lo que quiero
ResponderEliminarHola Remedios
Eliminarquizá, sin macros, con alguno de estos ejemplos encuentres la solución:
https://excelforo.blogspot.com/2019/04/reordenar-columnas-por-filas.html
https://excelforo.blogspot.com/2018/12/power-query-desapilando-columnas-datos.html
https://excelforo.blogspot.com/2018/12/desapilando-columnas-datos-excel.html
Espero te sirvan
Saludos