Як розділити один рядок на кілька рядків за допомогою Excel?


9

У мене в Excel є база даних про продукти з кількома сотнями записів, кожна з яких має від 1 до 3 "рівнів" ціноутворення: Standard, Deluxe і Premium. Кожен рівень має свою коду (A, B або C, додану до кінця базової SKU) та ціну. Мої дані такі:

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

Як би я подумав про те, щоб дані виглядали так:

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

Якщо це допоможе, я імпортую ці продукти в установку Magento.

Дякую за передовий.


Чи існує можливість наявності декількох подібних імен та описів? Наприклад , два рядки мають name1і , desc1але з різними цінами на ціну A, B, Ціна C і т.д.
Джеррі

У вихідних даних? Ні, я впевнений, що вони унікальні. Але, у нових даних точно знайдуться повтори.
GreysonD

Гаразд, я щось мав на увазі, але виявилося, що це не спрацює, якщо не буде більше маніпуляцій, щоб виправити деякі результати. Якщо вам цікаво, я намагався консолідовану зведену таблицю, але поле Опис та поля SKU потрібно було б витягнути окремо за допомогою index / match / vlookup, що робить його досить довгим у кінці.
Джеррі

Відповіді:


8

Ці завдання, як правило, швидше з VBA. Насправді мені знадобилося ~ 10 хвилин, щоб налаштувати його.
Я припускаю, що ваші дані перебувають у колонці А до стовпця H.

Перейдіть у Excel » Developer » Visual Basicрозділ »На лівій панелі відкрийте sheet1(або) аркуш, де перебувають ваші дані» Вставте код у вікні праворуч »Запустіть код

Код 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

Пояснення

Я мав намір тримати код якомога коротше, щоб пояснити його краще. В основному ми використовуємо дві петлі. Зовнішня петля ( i) призначена для рядків, а внутрішня - jдля цінових стовпців.

Ми активно використовуємо cells(rowNumber,columnNumber)для читання / запису комірок.

  • Рядок 2 | Почніть цикл з другого рядка до останнього. Проводимо повтор через кожен використаний ряд

  • Рядок 3 | Почніть другий цикл від 0 до 2 (це фактично 3 петлі, по одному на кожен стовпець Ціна)

  • Рядок 4 | Цей внутрішній цикл ми використовуємо для перевірки значень у нашому поточному рядку та стовпці Ціна А, потім Ціна В та в останній циклі Ціна С. Якщо ми знайдемо значення у стовпці Ціна, продовжуємо та копіюємо комірки. Якщо ціна не вставлена, ми нічого не робимо і переходимо до наступного стовпця "Ціна"

  • Рядок 5 | Підрахуйте лічильник, щоб знати, скільки рядків ми вже скопіювали,
    тож ми знаємо, після якого рядка ми можемо скопіювати наш поточний рядок

  • Рядок 6 | Скопіюйте стовпець імені

  • Рядок 7 | Скопіюйте стовпець з описом

  • Рядок 8 | Скопіюйте стовпець Ціна A або B або C залежно від того, який внутрішній цикл ми зараз знаходимо

  • Рядок 9 | Скопіюйте стовпець SKU A або B або C залежно від того, який внутрішній цикл ми зараз знаходимо

Скріншот результату

введіть тут опис зображення


1
Це фантастично! Саме те, що мені потрібно. Мої дані насправді трохи складніші, ніж мій приклад, і я новачок у VBA, тому ваше пояснення дуже допомагає. Дякую!
GreysonD

2

Ось рішення функції робочого аркуша. Формули трохи щільні, тому будьте попереджені, але це дасть те, що ви хочете.

Кроки:

  1. У першому рядку вашої нової таблиці Nameвведіть пряму посилання на першу Nameу своїх даних. У вашому прикладі ви б ввели, =A2де A2 - це ім'я, вказане у ваших даних. На прикладі скріншота, який я наводив нижче, ця формула використовується A8. Усі наступні формули дотримуватимуться макета, використовуваного на скріншоті. Звичайно, вам доведеться оновити всі посилання на діапазон, щоб відповідати вашим аркушам.
  2. У комірку нижче цього введіть таку формулу:
    = АБО (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ C $ 1: $ E $ 1, МАТЧ (A9, $ A $ 2: $ A $ 5,0), 0)), INDEX ($ A $ 2 : $ A $ 5, МАТЧ (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    Це в основному перевіряє, скільки рядків повинно бути для назва, зазначеного вище (в A9), і якщо кількість рядків, які вже є у вашій новій таблиці, відповідає цьому, то воно переходить до наступного імені. Якщо ні, інший рядок для імені вище буде додано.
    Заповніть цю формулу наскільки це потрібно (поки вона не поверне 0 замість імені).
  3. У першому рядку Descriptionвведіть наступну формулу та заповніть її.
    = INDEX ($ B $ 2: $ B $ 5, МАТЧ (A9, $ A $ 2: $ A $ 5,0))
  4. У першому рядку внизу SKUвставте таку формулу в рядок формул і натисніть Ctrl+ Shift+ Enter.
    = ІНДЕКС (OFFSET ($ A $ 1: $ H $ 1, МАТЧ (A9, $ A $ 2: $ A $ 5,0), 0), МАЛИЙ (ЯКЩО (OFFSET ($ F $ 1: $ H $ 1, МАТЧ (A9, $) A $ 2: $ A $ 5,0), 0) <> "", COLUMN ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Це формула масиву; при правильному введенні формула з’явиться на панелі формул, укладеній у фігурні дужки. Заповніть цю формулу своєю таблицею (кожен екземпляр також повинен відображатися у фігурних дужках).
  5. Аналогічно, в першому рядку внизу Priceвставте наступну формулу в рядок формул і введіть її у вигляді формули масиву (натискаючи Ctrl+ Shift+ Enter).
    = ІНДЕКС (OFFSET ($ A $ 1: $ H $ 1, МАТЧ ($ A9, $ A $ 2: $ A $ 5,0), 0), МАЛИЙ (ЯКЩО (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9) , $ A $ 2: $ A $ 5,0), 0) <> "", COLUMN ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Заповніть, і це має доповнити вашу таблицю.

Знімок екрана таблиці


Вражаючі формули! Між цим і відповіддю VBA, я налаштований на майже все. Дякую!
GreysonD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.