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


9

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: Estándar, Deluxe y Premium. Cada nivel tiene su propio SKU (A, B o C agregado al final del SKU base) y 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 que los datos se vean así?

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 en una instalación de Magento.

Gracias por adelantado.


¿Existe la posibilidad de que haya varios nombres y descripciones similares? Por ejemplo, dos líneas tienen name1y desc1con precios diferentes para el precio A, el precio B, el precio C, etc.
Jerry

En los datos originales? No, estoy seguro de que son únicos. Pero, en los nuevos datos definitivamente habrá repeticiones.
GreysonD

De acuerdo, tenía algo en mente, pero resultó que no funcionaría a menos que haya más manipulación para corregir algunos resultados. Si tiene curiosidad, estaba probando una tabla dinámica consolidada, pero el campo Descripción y los campos SKU tendrían que extraerse por separado usando index / match / vlookup, lo que lo hace bastante largo al final.
Jerry

Respuestas:


8

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

Vaya a Excel » Developer » Visual Basic»En el panel izquierdo, abra sheet1(o) la hoja donde residen sus datos» Inserte el código en la ventana derecha »Ejecute 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

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

Usamos mucho cells(rowNumber,columnNumber)para leer / escribir celdas.

  • Línea 2 | Comience un ciclo desde la fila 2 hasta su última fila. Repetimos cada fila usada

  • Línea 3 | Inicie un segundo ciclo de 0 a 2 (que en realidad son 3 ciclos, uno para cada columna de precio)

  • Línea 4 | Usamos este bucle interno para verificar los valores en nuestra fila y columna actuales Precio A, luego Precio B y en el último bucle Precio C. Si encontramos un valor en una columna Precio, continuamos y copiamos celdas. Si no se inserta ningún Precio, no hacemos nada y pasamos a la siguiente columna de Precio

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

  • Línea 6 | Copie la columna del nombre

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

  • Línea 8 | Copie la columna Precio A o B o C dependiendo de qué bucle interno estemos actualmente

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

Captura de pantalla de resultados

ingrese la descripción de la imagen aquí


1
¡Esto es fantástico! Exactamente lo que necesito. Mis datos son en realidad un poco más complejos que mi ejemplo, y soy nuevo en VBA, por lo que su explicación es de gran ayuda. ¡Gracias!
GreysonD

2

Aquí hay una solución de función de hoja de trabajo. Las fórmulas son un poco densas, así que ten cuidado, pero esto te dará lo que quieres.

Pasos:

  1. En la primera fila de su nueva tabla, debajo Name, ingrese una referencia directa a la primera Nameen sus datos. En su ejemplo, ingresaría =A2donde A2 es el primer nombre que figura en sus datos. En la captura de pantalla de ejemplo que proporcioné a continuación, entra esta fórmula A8. Todas las siguientes fórmulas seguirán el diseño utilizado en la captura de pantalla. Por supuesto, tendrá que actualizar todas las referencias de rango para que coincidan con sus hojas.
  2. En la celda debajo de esto, ingrese la siguiente fórmula:
    = IF (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0)), INDEX ($ A $ 2 : $ A $ 5, PARTIDO (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    Básicamente, esto verifica cuántas filas debería haber para el nombre mencionado anteriormente (en A9), y si el número de filas que ya están en su nueva tabla coincide con esto, entonces se pasa al siguiente nombre. De lo contrario, se agregará otra fila para el nombre anterior.
    Complete esta fórmula tanto como sea necesario (hasta que devuelva un 0 en lugar de un nombre).
  3. En la primera fila debajo de Descriptioningrese la siguiente fórmula y complete.
    = ÍNDICE ($ B $ 2: $ B $ 5, PARTIDO (A9, $ A $ 2: $ A $ 5,0))
  4. En la primera fila debajo SKU, pegue la siguiente fórmula en la barra de fórmulas y presione Ctrl+ Shift+ Enter.
    = ÍNDICE (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $ 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 ingresa correctamente, la fórmula aparecerá en la barra de fórmulas entre corchetes. Complete esta fórmula en su tabla (cada instancia también debe aparecer entre llaves).
  5. De manera similar, en la primera fila debajo Price, pegue la siguiente fórmula en la barra de fórmulas e ingrésela como una fórmula de matriz (presionando Ctrl+ Shift+ Enter).
    = ÍNDICE (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9) , $ A $ 2: $ A $ 5,0), 0) <> "", COLUMNA ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Rellene, y esto debería completar su tabla.

Captura de pantalla de la mesa


Fórmulas impresionantes! Entre esto y la respuesta de VBA, estoy listo para casi todo. ¡Gracias!
GreysonD
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.