jueves, 10 de abril de 2014

VBA: Cómo transponer datos según cambio de criterio.

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::

VBA: Cómo transponer datos según cambio de criterio.


El objetivo es llegar a:

VBA: Cómo transponer datos según cambio de criterio.



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.

18 comentarios:

  1. No me sirve el codigo, me puede ayudar por favor.

    ResponderEliminar
  2. Este es el código para Excel 2013 en adelante.


    Sub 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

    ResponderEliminar
    Respuestas
    1. Hola Álvaro,
      qué no te funciona??
      Parece que el código es el mismo que el del post???

      Saludos

      Eliminar
    2. La "Hoja4" es donde se quiere ubicar la nueva tabla?

      Eliminar
    3. Me sale este error

      "Se ha producido el error '424' en tiempo de ejecución:

      Se requiere un objeto"

      Eliminar
    4. Hola,
      te has asegurado que existe una hoja que se llama exactamente 'Hoja4' ??

      Slds

      Eliminar
  3. Hola, no entiendo bien la programacion por lo que no puedo adaptarlo a mi necesidad.

    Tengo 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

    ResponderEliminar
    Respuestas
    1. Hola,
      solo 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

      Eliminar
  4. Me sirvió muchísimo....muchas gracias!!!!

    ResponderEliminar
  5. Hola me aparece error 9 que debo hacer

    ResponderEliminar
    Respuestas
    1. Hola,
      asegúrate existe la hoja con el nombre que estás empleando...

      Saludos

      Eliminar
  6. Hola!
    Tengo 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!

    ResponderEliminar
    Respuestas
    1. Hola Rodolfo,
      quizá 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

      Eliminar
  7. 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.

    Saludos.

    ResponderEliminar
  8. 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

    ResponderEliminar
    Respuestas
    1. Hola Remedios
      quizá, 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

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.