Come divido una riga in più righe con Excel?


9

Ho un database di prodotti in Excel con diverse centinaia di voci, ognuna delle quali ha da 1 a 3 "livelli" di prezzo: Standard, Deluxe e Premium. Ogni livello ha il proprio SKU (A, B o C aggiunti alla fine dello SKU di base) e il prezzo. I miei dati sono così:

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

Come farei per ottenere i dati in questo modo:

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

Se aiuta, ho intenzione di importare questi prodotti in un'installazione Magento.

Grazie in anticipo.


Esiste la possibilità che ci siano molti nomi e descrizioni simili? Ad esempio, due linee hanno name1e desc1con prezzi diversi per il prezzo A, il prezzo B, il prezzo C, ecc.
Jerry,

Nei dati originali? No, sono sicuro che sono unici. Ma nei nuovi dati ci saranno sicuramente ripetizioni.
GreysonD,

Ok, avevo in mente qualcosa, ma alla fine non avrebbe funzionato a meno che non ci fosse più manipolazione dietro per correggere alcuni risultati. Se sei curioso, stavo provando una tabella pivot consolidata, ma il campo Descrizione e i campi SKU dovevano essere estratti separatamente utilizzando index / match / vlookup, il che lo rende piuttosto lungo alla fine.
Jerry,

Risposte:


8

Queste attività sono generalmente più veloci con VBA. In effetti, mi ci sono voluti ~ 10 minuti per installarlo.
Suppongo che i tuoi dati siano nella colonna A alla colonna H.

Vai a Excel » Developer » Visual Basic»Nel riquadro di sinistra apri sheet1(o) il foglio in cui risiedono i tuoi dati» Inserisci il codice nella finestra di destra »Esegui il codice

Codice 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

Spiegazione

Era mia intenzione mantenere il codice il più breve possibile per spiegarlo meglio. Fondamentalmente usiamo due loop. Il ciclo esterno ( i) è per le righe e il ciclo interno ( j) per le colonne dei prezzi.

Usiamo pesantemente cells(rowNumber,columnNumber)per leggere / scrivere celle.

  • Linea 2 | Inizia un loop dalla riga 2 all'ultima riga. Esaminiamo ogni riga utilizzata

  • Linea 3 | Inizia un secondo loop da 0 a 2 (che in realtà sono 3 loop, uno per ogni colonna Price)

  • Linea 4 | Usiamo questo ciclo interno per verificare i valori nella nostra riga e colonna correnti Prezzo A, quindi Prezzo B e nell'ultimo ciclo Prezzo C. Se troviamo un valore in una colonna Prezzo, andiamo avanti e copiamo le celle. Se non viene inserito alcun prezzo, non facciamo nulla e passiamo alla colonna Prezzo successiva

  • Linea 5 | Conta un contatore per sapere quante righe abbiamo già copiato,
    quindi sappiamo dopo quale riga possiamo copiare la nostra riga corrente

  • Linea 6 | Copia la colonna del nome

  • Linea 7 | Copia la colonna della descrizione

  • Linea 8 | Copia la colonna Prezzo A o B o C in base al circuito interno che siamo attualmente

  • Linea 9 | Copia la colonna SKU A o B o C in base al loop interno che siamo attualmente

Schermata dei risultati

inserisci qui la descrizione dell'immagine


1
È fantastico! Esattamente quello di cui ho bisogno. I miei dati sono in realtà un po 'più complessi del mio esempio e sono nuovo di VBA, quindi la tua spiegazione aiuta enormemente. Grazie!
GreysonD,

2

Ecco una soluzione per le funzioni del foglio di lavoro. Le formule sono un po 'dense, quindi fai attenzione, ma questo ti darà ciò che desideri.

passi:

  1. Nella prima riga della nuova tabella, sotto Name, inserisci un riferimento diretto al primo Namenei tuoi dati. Nel tuo esempio, inserisci =A2dove A2 è il nome elencato nei tuoi dati. Nello screenshot di esempio che ho fornito di seguito, questa formula entra in gioco A8. Tutte le seguenti formule seguiranno il layout utilizzato nello screenshot. Ovviamente dovrai aggiornare tutti i riferimenti di intervallo in modo che corrispondano ai tuoi fogli.
  2. Nella cella sottostante, inserisci la seguente formula:
    = SE (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0)), INDEX ($ A $ 2 : $ A $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    Questo controlla fondamentalmente quante righe dovrebbero esserci per il nome elencato sopra (in A9) e se il numero di righe già nella tua nuova tabella corrisponde a questo, passa al nome successivo. In caso contrario, verrà aggiunta un'altra riga per il nome sopra.
    Riempi questa formula fino a quando è necessario (fino a quando non restituisce uno 0 anziché un nome).
  3. Nella prima riga sotto Descriptioninserisci la seguente formula e compila verso il basso.
    = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0))
  4. Nella prima riga sotto SKU, incolla la seguente formula nella barra della formula e premi Ctrl+ Shift+ Enter.
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, CORRISPONDENZA (A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ F $ 1: $ H $ 1, CORRISPONDENZA (A9, $ A $ 2: $ A $ 5,0), 0) <> "", COLONNA ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Questa è una formula di matrice; se inserito correttamente, la formula apparirà nella barra della formula racchiusa tra parentesi graffe. Riempi questa formula nella tabella (ogni istanza dovrebbe anche apparire tra parentesi graffe).
  5. Allo stesso modo, nella prima riga sotto Price, incolla la seguente formula nella barra della formula e inseriscila come formula di matrice (premendo Ctrl+ Shift+ Enter).
    = INDEX (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) <> "", COLONNA ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Compila, e questo dovrebbe completare il tuo tavolo.

Schermata della tabella


Formule impressionanti! Tra questa e la risposta VBA, sono pronto per praticamente tutto. Grazie!
GreysonD,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.