¿Cómo divido una fila en varias filas con Excel?

Tengo una base de datos de productos en Excel con varios cientos de entradas, cada una de las cuales tiene de 1 a 3 "niveles" de precios: Standard, Deluxe y Premium. Cada nivel tiene su propio SKU (A, B o C añadido al final del SKU de base) y el precio. Mis datos son así:

Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C name1, desc1, 14.95, 19.95, , sku1A, sku1B, name2, desc2, 4.95, 9.95, 12.95, sku2A, sku2B, sku2C name3, desc3, 49.95, , , sku3A, , 

¿Cómo haría para obtener los datos de esta forma:

 Name, Description, SKU, Price name1, desc1, sku1A, 14.95 name1, desc1, sku1B, 19.95 name2, desc2, sku2A, 4.95 name2, desc2, sku2B, 9.95 name2, desc2, sku2C, 12.95 name3, desc3, sku3A, 49.95 

Si ayuda, voy a importar estos productos a una instalación de Magento.

Gracias por adelantado.

Esas tareas suelen ser más rápidas con VBA. De hecho, me tomó ~ 10 minutos para configurarlo.
Supongo que sus datos están en la columna A a la columna H.

Ir a Excel » Developer » Visual Basic »En el panel izquierdo abrir sheet1 (o) la hoja donde reside su información» Insertar el código en la ventana de la derecha »Ejecutar el código

Código VBA

 1 |Sub NewLayout() 2 | For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row 3 | For j = 0 To 2 4 | If Cells(i, 3 + j) <> vbNullString Then 5 | intCount = intCount + 1 6 | Cells(i, 1).Copy Destination:=Cells(intCount, 10) 7 | Cells(i, 2).Copy Destination:=Cells(intCount, 11) 8 | Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12) 9 | Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13) 10| End If 11| Next j 12| Next i 13|End Sub 

Explicación

Era mi intención mantener el código lo más corto posible para explicarlo mejor. Básicamente usamos dos bucles. El bucle exterior ( i ) es para las filas y el bucle interno ( j ) para las columnas de precios.

Utilizamos en gran medida las cells(rowNumber,columnNumber) para leer / escribir celdas.

  • Línea 2 | Iniciar un bucle de la fila 2 a la última fila. Hacemos iteración en todas las filas usadas

  • Línea 3 | Comience un segundo bucle de 0 a 2 (que son en realidad 3 bucles, uno por cada columna de precio)

  • Línea 4 | Utilizamos este bucle interno para verificar los valores en nuestra fila actual y en la columna Precio A, luego en el Precio B y en el último Bucle Precio C. Si encontramos un valor en una columna Precio, seguimos copiando las celdas. Si no se introduce ningún Precio, no hacemos nada y pasamos a la siguiente columna de Precio

  • Línea 5 | Cuenta un contador para saber cuántas filas ya copiamos,
    Así que sabemos después de qué fila podemos copiar nuestra fila actual

  • Línea 6 | Copiar la columna de nombre

  • Línea 7 | Copiar la columna de descripción

  • Línea 8 | Copia la columna de precio A o B o C dependiendo de qué bucle interno estamos actualmente

  • Línea 9 | Copie la columna SKU A o B o C dependiendo de qué bucle interno estamos actualmente

Captura de pantalla del resultado

Introduzca aquí la descripción de la imagen

Aquí está una solución de función de hoja de cálculo. Las fórmulas son un poco densas, así que ten cuidado, pero esto dará lo que quieras.

Pasos:

  1. En la primera fila de su nueva tabla, en Name , escriba una referencia directa al primer Name de sus datos. En su ejemplo, introduzca =A2 donde A2 es el primer nombre que aparece en sus datos. En la captura de pantalla de ejemplo que he proporcionado a continuación, esta fórmula va en A8 . Todas las fórmulas siguientes seguirán el diseño utilizado en la captura de pantalla. Por supuesto, tendrá que actualizar todas las referencias de rango para que coincida con su hoja (s).
  2. En la celda debajo, ingrese la siguiente fórmula:
     = IF (COUNTIF ($ A $ 9: A9, A9) = COUNTA ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0) : $ A $ 5, PARTIDO (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    

    Esto básicamente comprueba cuántas filas debe haber para el nombre que aparece arriba (en A9 ), y si el número de filas que ya se encuentra en su nueva tabla coincide con esto, entonces pasa al siguiente nombre. Si no es así, se agregará otra fila para el nombre anterior.
    Rellene esta fórmula hasta donde sea necesario (hasta que devuelva un 0 en lugar de un nombre).

  3. En la primera fila bajo Description ingrese la siguiente fórmula y rellene.
     = ÍNDICE ($ B $ 2: $ B $ 5, PARTIDO (A9, $ A $ 2: $ A $ 5,0)) 
  4. En la primera fila bajo SKU , pegue la siguiente fórmula en la barra de fórmulas y presione Ctrl + Mayús + Intro .
     = INDICE (OFFSET ($ A $ 1: $ H $ 1, PARTIDO (A9, $ A $ 2: $ A $ 5,0), 0), PEQUEÑO A $ 2: $ A $ 5,0), 0) <> "", COLUMNA ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9) 

    Esta es una fórmula de matriz; Si se introduce correctamente la fórmula aparecerá en la barra de fórmulas entre corchetes. Rellene esta fórmula en su tabla (cada instancia también debe aparecer entre corchetes).

  5. De manera similar, en la primera fila bajo Price , pegue la siguiente fórmula en la barra de fórmulas e introdúzcala como una fórmula de matriz (presionando Ctrl + Mayús + Enter ).
     = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), PEQUEÑO , $ A $ 2: $ A $ 5,0), 0) <> "", COLUMN ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9) 

    Rellene, y esto debe completar su tabla.

Captura de pantalla de table