Jak podzielić jeden wiersz na wiele wierszy za pomocą programu Excel?

9

Mam bazę danych produktów w Excelu z kilkoma setkami wpisów, z których każdy zawiera od 1 do 3 „poziomów” wyceny: Standard, Deluxe i Premium. Każdy poziom ma własną jednostkę SKU (A, B lub C dodaną na końcu podstawowej jednostki SKU) i cenę. Moje dane są takie:

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

Jak mógłbym zacząć wyglądać tak, aby dane:

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

Jeśli to pomoże, zamierzam importować te produkty do instalacji Magento.

Dziękuję z góry.

GreysonD
źródło
Czy istnieje możliwość, że istnieje kilka podobnych nazw i opisów? Np. Dwie linie mają name1i mają desc1różne ceny za cenę A, cenę B, cenę C itp.
Jerry,
W oryginalnych danych? Nie, jestem pewien, że są wyjątkowe. Ale w nowych danych na pewno będą powtórzenia.
GreysonD,
Okej, miałem coś na myśli, ale okazało się, że to nie zadziała, chyba że będzie więcej manipulacji w celu skorygowania niektórych wyników. Jeśli jesteś ciekawy, próbowałem Skonsolidowanej tabeli przestawnej, ale pole Opis i pola SKU musiałyby być osobno pobierane przy użyciu indeksu / dopasowania / vlookup, co czyni go dość długim na końcu.
Jerry

Odpowiedzi:

8

Te zadania są zwykle szybsze dzięki VBA. W rzeczywistości zajęło mi to około 10 minut.
Zakładam, że Twoje dane znajdują się w kolumnach od A do H.

Przejdź do Excel » Developer » Visual Basic»W lewym okienku otwórz sheet1(lub) arkusz, w którym znajdują się dane» Wstaw kod w prawym oknie »Uruchom kod

Kod 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

Wyjaśnienie

Moim zamiarem było, aby kod był jak najkrótszy, aby lepiej go wyjaśnić. Zasadniczo używamy dwóch pętli. Zewnętrzna pętla ( i) dotyczy wierszy, a wewnętrzna pętla ( j) dla kolumn cenowych.

Często używamy cells(rowNumber,columnNumber)do odczytu / zapisu komórek.

  • Wiersz 2 | Rozpocznij pętlę od rzędu 2 do ostatniego rzędu. Iterujemy przez każdy używany wiersz

  • Wiersz 3 | Rozpocznij drugą pętlę od 0 do 2 (w rzeczywistości są to 3 pętle, jedna na każdą kolumnę Cena)

  • Wiersz 4 | Używamy tej wewnętrznej pętli do sprawdzania wartości w naszym bieżącym wierszu i kolumnie Cena A, a następnie Cena B i w ostatniej pętli Cena C. Jeśli znajdziemy wartość w kolumnie Cena, kontynuujemy i kopiujemy komórki. Jeśli nie zostanie wstawiona cena, nic nie robimy i przechodzimy do następnej kolumny Cena

  • Wiersz 5 | Policz licznik, aby dowiedzieć się, ile wierszy już skopiowaliśmy,
    dzięki czemu wiemy, po którym wierszu możemy skopiować nasz bieżący wiersz

  • Wiersz 6 | Skopiuj kolumnę nazwy

  • Wiersz 7 | Skopiuj kolumnę opisu

  • Linia 8 | Skopiuj kolumnę Cena A, B lub C w zależności od tego, jaką obecnie jesteśmy pętlą wewnętrzną

  • Linia 9 | Skopiuj kolumnę SKU A lub B lub C w zależności od tego, jaką obecnie jesteśmy pętlą wewnętrzną

Zrzut ekranu wyniku

wprowadź opis zdjęcia tutaj

nixda
źródło
1
To jest fantastyczne! Właśnie tego potrzebuję. Moje dane są w rzeczywistości nieco bardziej złożone niż mój przykład i jestem nowy w VBA, więc twoje wyjaśnienie bardzo pomaga. Dzięki!
GreysonD
2

Oto rozwiązanie funkcji arkusza roboczego. Formuły są nieco gęste, więc ostrzegam, ale da to, co chcesz.

Kroki:

  1. W pierwszym wierszu nowej tabeli w Namepolu wpisz bezpośrednie odniesienie do pierwszego Namew danych. W twoim przykładzie wprowadziłbyś, =A2gdzie A2 jest imieniem wymienionym w twoich danych. W przykładowym zrzucie ekranu, który przedstawiłem poniżej, ta formuła wchodzi w grę A8. Wszystkie poniższe formuły będą zgodne z układem zastosowanym na zrzucie ekranu. Będziesz oczywiście musiał zaktualizować wszystkie odwołania do zakresu, aby pasowały do ​​arkusza (arkuszy).
  2. W komórce poniżej wprowadź następującą formułę:
    = JEŻELI (LICZ.JEŻELI (9 $ A $: A9, A9) = COUNTA (PRZESUNIĘCIE ($ C $ 1: $ E $ 1, MATCH (A9, $ A $ 2: $ 5,0 $), 0)), INDEKS (2 $ A $ : 5 A $, MECZ (A9, 2 A $: 5,0 $ A) +1), A9)
    
    To w zasadzie sprawdza, ile wierszy powinno być dla nazwy wymienionej powyżej (in A9), a jeśli liczba wierszy już w nowej tabeli pasuje do tego, to przechodzi do następnej nazwy. Jeśli nie, zostanie dodany kolejny wiersz dla powyższej nazwy.
    Wypełnij tę formułę tak daleko, jak potrzebujesz (dopóki nie zwróci 0 zamiast nazwy).
  3. W pierwszym wierszu pod Descriptionwpisz następującą formułę i wypełnij.
    = INDEKS (2 $ B $: 5 $ B $, MECZ (A9, 2 $ A: 5,0 $)
  4. W pierwszym wierszu poniżej SKUwklej następującą formułę na pasku formuły i naciśnij Ctrl+ Shift+ Enter.
    = INDEKS (OFFSET ($ A $ 1: $ H $ 1, MECZ (A9, $ A $ 2: $ 5,0 $), 0), MAŁY (JEŻELI (OFFSET ($ F $ 1: $ H $ 1, MECZ (A9, $ 2 USD: 5,0 USD), 0) <> "", KOLUMNA (1 F $ 1 USD: 1 H $ 1)), LICZBA (9 USD: 9 A9 USD, A9)))
    To jest formuła tablicowa; jeśli zostanie wpisany poprawnie, formuła pojawi się na pasku formuły w nawiasach klamrowych. Wypełnij tę formułę w dół tabeli (każde wystąpienie powinno również pojawić się w nawiasach klamrowych).
  5. Podobnie w pierwszym wierszu poniżej Pricewklej następującą formułę do paska formuły i wprowadź ją jako formułę tablicową (naciskając Ctrl+ Shift+ Enter).
    = INDEKS (PRZESUNIĘCIE (1 $ A $: 1 H $ 1, MECZ (A9 $, 2 A $ 2: 5,0 $ A $), 0), MAŁY (JEŻELI (PRZESUNIĘCIE (1 C $: 1 E $ 1, MECZ (A9 $) , $ A $ 2: $ 5,0 $), 0) <> "", KOLUMNA (1 $ C $: 1 $ E $)), LICZ.JEŻELI (9 $ A9: A9 $, A9)))
    Wypełnij, a to powinno uzupełnić twój stół.

Zrzut ekranu tabeli

Excellll
źródło
Imponujące formuły! Pomiędzy tym a odpowiedzią VBA jestem gotowy na prawie wszystko. Dzięki!
GreysonD