Bagaimana cara membagi satu baris menjadi beberapa baris dengan Excel?


9

Saya memiliki basis data produk di Excel dengan beberapa ratus entri, yang masing-masing memiliki dari 1 hingga 3 "tingkatan" harga: Standar, Deluxe, dan Premium. Setiap tingkatan memiliki SKU sendiri (A, B, atau C ditambahkan pada akhir SKU dasar) dan harga. Data saya seperti ini:

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

Bagaimana cara saya mendapatkan data agar terlihat seperti ini:

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

Jika ini membantu, saya akan mengimpor produk-produk ini ke instalasi Magento.

Terima kasih sebelumnya.


Apakah ada kemungkinan ada beberapa nama dan deskripsi yang serupa? Misalnya, Dua baris memiliki name1dan desc1tetapi dengan harga yang berbeda untuk Harga A, Harga B, Harga C, dll.
Jerry

Dalam data asli? Tidak, saya yakin mereka unik. Tapi, dalam data baru pasti akan ada pengulangan.
GreysonD

Oke, saya punya sesuatu dalam pikiran, tetapi ternyata itu tidak akan berfungsi kecuali ada manipulasi di belakang untuk memperbaiki beberapa hasil. Jika Anda penasaran, saya sedang mencoba PivotTable Konsolidasi, tetapi bidang Deskripsi dan bidang SKU harus ditarik secara terpisah menggunakan indeks / match / vlookup, yang membuatnya cukup lama di bagian akhir.
Jerry

Jawaban:


8

Tugas-tugas itu biasanya lebih cepat dengan VBA. Bahkan, butuh saya ~ 10 menit untuk mengaturnya.
Saya menganggap data Anda ada di kolom A hingga kolom H.

Pergi ke Excel » Developer » Visual Basic»Di jendela kiri buka sheet1(atau) lembar tempat data Anda berada» Masukkan kode di jendela kanan »Jalankan kode

Kode 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

Penjelasan

Adalah niat saya untuk menjaga kode sesingkat mungkin untuk menjelaskannya dengan lebih baik. Pada dasarnya kami menggunakan dua loop. Loop luar ( i) adalah untuk baris dan loop dalam ( j) untuk kolom harga.

Kami banyak menggunakan cells(rowNumber,columnNumber)untuk membaca / menulis sel.

  • Baris 2 | Mulai loop dari baris 2 ke baris terakhir Anda. Kami beralih melalui setiap baris yang digunakan

  • Baris 3 | Mulai loop kedua dari 0 hingga 2 (yang sebenarnya adalah 3 loop, satu untuk setiap kolom Harga)

  • Baris 4 | Kami menggunakan loop dalam ini untuk memeriksa nilai-nilai di baris dan kolom kami saat ini Harga A, lalu Harga B dan di loop terakhir Harga C. Jika kami menemukan nilai dalam kolom Harga, kami melanjutkan dan menyalin sel. Jika tidak ada Harga yang dimasukkan, kami tidak melakukan apa pun dan melanjutkan ke kolom Harga berikutnya

  • Baris 5 | Hitung penghitung untuk mengetahui berapa baris yang sudah kita salin,
    jadi kita tahu setelah baris apa kita bisa menyalin baris kita saat ini

  • Baris 6 | Salin kolom nama

  • Baris 7 | Salin kolom deskripsi

  • Baris 8 | Salin kolom Harga A atau B atau C tergantung pada loop dalam apa kita saat ini

  • Baris 9 | Salin kolom SKU A atau B atau C tergantung pada apa loop dalam kita saat ini

Tangkapan layar hasil

masukkan deskripsi gambar di sini


1
Ini fantastis! Apa yang saya butuhkan. Data saya sebenarnya sedikit lebih kompleks daripada contoh saya, dan saya baru di VBA, jadi penjelasan Anda sangat membantu. Terima kasih!
GreysonD

2

Berikut ini adalah solusi fungsi lembar kerja. Rumusnya agak padat, jadi berhati-hatilah, tetapi ini akan memberikan apa yang Anda inginkan.

Langkah:

  1. Di baris pertama tabel baru Anda, di bawah Name, masukkan referensi langsung ke yang pertama Namedi data Anda. Dalam contoh Anda, Anda akan memasukkan di =A2mana A2 adalah nama pertama yang tercantum dalam data Anda. Pada contoh tangkapan layar yang saya berikan di bawah, rumus ini masuk A8. Semua rumus berikut akan mengikuti tata letak yang digunakan dalam tangkapan layar. Anda tentu saja harus memperbarui semua referensi rentang agar sesuai dengan lembar Anda.
  2. Di sel di bawah ini, masukkan rumus berikut:
    = JIKA (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)
    
    Ini pada dasarnya memeriksa berapa banyak baris yang harus ada untuk nama yang tercantum di atas (dalam A9), dan jika jumlah baris yang sudah ada di tabel baru Anda cocok dengan ini, maka pindah ke nama berikutnya. Jika tidak, baris lain untuk nama di atas akan ditambahkan.
    Isi formula ini sejauh yang Anda perlukan (sampai mengembalikan 0 bukannya nama).
  3. Di baris pertama di bawah, Descriptionmasukkan formula berikut dan isi.
    = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0))
  4. Di baris pertama di bawah SKU, tempel rumus berikut ke bilah rumus dan tekan Ctrl+ Shift+ Enter.
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5.0), 0), KECIL (JIKA (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5.0), 0) <> "", COLUMN ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Ini adalah rumus array; jika dimasukkan dengan benar, rumus akan muncul di bilah rumus yang terlampir dalam kurung keriting. Isi formula ini di bawah meja Anda (setiap contoh juga akan muncul dalam kurung keriting).
  5. Demikian pula, di baris pertama di bawah Price, tempel rumus berikut ke bilah rumus dan masukkan sebagai rumus larik (dengan menekan Ctrl+ Shift+ Enter).
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH ($ A9, $ A $ 2: $ A $ 5.0), 0), KECIL (JIKA (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9 , $ A $ 2: $ A $ 5.0), 0) <> "", COLUMN ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9))))
    Isi, dan ini harus melengkapi tabel Anda.

Tangkapan layar tabel


Formula yang mengesankan! Antara ini dan jawaban VBA, saya siap untuk segalanya. Terima kasih!
GreysonD
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.