ฉันจะแบ่งหนึ่งแถวเป็นหลายแถวด้วย Excel ได้อย่างไร


9

ฉันมีฐานข้อมูลผลิตภัณฑ์ใน Excel ที่มีหลายร้อยรายการแต่ละรายการมีราคาตั้งแต่ 1 ถึง 3 "ระดับ": Standard, Deluxe และ Premium แต่ละชั้นมี SKU ของตัวเอง (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, ฯลฯ
Jerry

ในข้อมูลต้นฉบับ? ไม่ฉันแน่ใจว่ามันไม่เหมือนใคร แต่ในข้อมูลใหม่จะมีการทำซ้ำอย่างแน่นอน
GreysonD

โอเคฉันมีบางอย่างในใจ แต่กลับกลายเป็นว่ามันจะไม่ทำงานเว้นแต่จะมีการจัดการมากขึ้นเพื่อแก้ไขผลลัพธ์บางอย่าง หากคุณสงสัยว่าฉันกำลังลอง PivotTable รวมอยู่ แต่ฟิลด์คำอธิบายและฟิลด์ SKU จะต้องถูกดึงแยกต่างหากโดยใช้ดัชนี / การจับคู่ / vlookup ซึ่งทำให้ท้ายค่อนข้างยาว
Jerry

คำตอบ:


8

งานเหล่านั้นมักจะเร็วขึ้นด้วย VBA ที่จริงแล้วฉันใช้เวลาประมาณ 10 นาทีในการตั้งค่า
ฉันสมมติว่าข้อมูลของคุณอยู่ในคอลัมน์ A ถึงคอลัมน์ 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 | เริ่มวนซ้ำจากแถว 2 ถึงแถวสุดท้ายของคุณ เราวนซ้ำทุกแถวที่ใช้

  • บรรทัดที่ 3 | เริ่มการวนซ้ำครั้งที่สองจาก 0 ถึง 2 (ที่จริงแล้วคือ 3 ลูปหนึ่งอันสำหรับทุกคอลัมน์ราคา)

  • บรรทัด 4 | เราใช้วงในนี้เพื่อตรวจสอบค่าในแถวและคอลัมน์ราคาปัจจุบันของเราแล้วราคา B และในวงวนสุดท้ายราคา C. หากเราพบค่าในคอลัมน์ราคาเราจะไปและคัดลอกเซลล์ หากไม่มีการแทรกราคาเราจะไม่ทำอะไรเลยและไปยังคอลัมน์ราคาถัดไป

  • บรรทัดที่ 5 | นับจำนวนตัวนับเพื่อทราบจำนวนแถวที่เราคัดลอกไปแล้ว
    เพื่อให้เราทราบหลังแถวที่เราสามารถคัดลอกแถวปัจจุบันของเรา

  • บรรทัด 6 | คัดลอกคอลัมน์ชื่อ

  • บรรทัด 7 | คัดลอกคอลัมน์คำอธิบาย

  • บรรทัดที่ 8 | คัดลอกคอลัมน์ราคา A หรือ B หรือ C ขึ้นอยู่กับว่าเราอยู่ในวงใด

  • บรรทัดที่ 9 | คัดลอกคอลัมน์ SKU A หรือ B หรือ C ขึ้นอยู่กับว่าเราอยู่ในวงใด

ภาพหน้าจอผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่


1
มันยอดเยี่ยมมาก! สิ่งที่ฉันต้องการ ข้อมูลของฉันนั้นซับซ้อนกว่าตัวอย่างเล็กน้อยและฉันใหม่กับ VBA ดังนั้นคำอธิบายของคุณจึงช่วยได้อย่างมาก ขอบคุณ!
GreysonD

2

นี่คือโซลูชันฟังก์ชันแผ่นงาน สูตรมีความหนาแน่นเล็กน้อยดังนั้นควรเตือน แต่สิ่งนี้จะให้สิ่งที่คุณต้องการ

ขั้นตอน:

  1. ในแถวแรกของตารางใหม่ของคุณภายใต้Nameป้อนอ้างอิงโดยตรงกับครั้งแรกNameในข้อมูลของคุณ ในตัวอย่างของคุณคุณจะป้อน=A2โดยที่ A2 เป็นชื่อแรกที่แสดงอยู่ในข้อมูลของคุณ A8ในภาพตัวอย่างที่ผมเคยให้ไว้ด้านล่างสูตรนี้ไปในการ สูตรต่อไปนี้ทั้งหมดจะเป็นไปตามเค้าโครงที่ใช้ในภาพหน้าจอ แน่นอนคุณจะต้องอัปเดตการอ้างอิงช่วงทั้งหมดเพื่อให้ตรงกับแผ่นงานของคุณ
  2. ในเซลล์ด้านล่างนี้ให้ป้อนสูตรต่อไปนี้:
    = 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, MATCH (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    โดยทั่วไปจะตรวจสอบจำนวนแถวที่ควรมีสำหรับชื่อที่ระบุไว้ข้างต้น (เป็นA9) และหากจำนวนแถวในตารางใหม่ของคุณตรงกับสิ่งนี้แล้วมันจะย้ายไปยังชื่อถัดไป หากไม่ใช่จะมีการเพิ่มแถวอื่นสำหรับชื่อข้างต้น
    เติมสูตรนี้เท่าที่คุณต้องการ (จนกว่าจะส่งคืน 0 แทนชื่อ)
  3. ในแถวแรกภายใต้Descriptionป้อนสูตรต่อไปนี้และเติมลงไป
    = INDEX ($ B $ 2: $ B $ 5, MATCH (A9, $ A $ 2: $ A $ 5,0))
  4. ในแถวแรกภายใต้การSKUวางสูตรต่อไปนี้ลงในแถบสูตรและกดCtrl+ +ShiftEnter
    = INDEX (OFFSET ($ A $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ $ 5,0), 0), SMALL (IF (OFFSET ($ F $ 1: $ H $ 1, MATCH (A9, $ A $ 2: $ A $ 5,0), 0) <> "" คอลัมน์ ($ F $ 1: $ H $ 1)) COUNTIF ($ A $ 9: $ A9, $ A9)))
    นี่คือสูตรอาร์เรย์ หากป้อนอย่างถูกต้องสูตรจะปรากฏในแถบสูตรที่อยู่ในเครื่องหมายปีกกา เติมสูตรนี้ลงในตารางของคุณ (แต่ละอินสแตนซ์ควรปรากฏในวงเล็บปีกกาด้วย)
  5. ในทำนองเดียวกันในแถวแรกภายใต้Priceวางสูตรต่อไปนี้ลงในแถบสูตรและป้อนเป็นสูตรอาร์เรย์ (โดยกดCtrl+ Shift+ Enter)
    = INDEX (OFFSET ($ A $ 1: 1 $ H $, MATCH ($ A9, $ A $ 2: $ A $ 5,0), 0), SMALL (IF (OFFSET ($ C $ 1: $ E $ 1, MATCH ($ A9 , $ A $ 2: $ A $ 5,0), 0) <> "" คอลัมน์ ($ C $ 1: $ E $ 1)) COUNTIF ($ A $ 9: $ A9, $ A9)))
    กรอกข้อมูลและสิ่งนี้จะทำให้ตารางของคุณสมบูรณ์

สกรีนช็อตของตาราง


สูตรที่น่าประทับใจ! ระหว่างนี้และคำตอบของ VBA ฉันถูกกำหนดให้ทำทุกอย่าง ขอบคุณ!
GreysonD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.