วิธีการรวมค่าจากหลายแถวเข้าด้วยกันเป็นแถวเดียวใน Excel


10

ฉันมีการถ่ายโอนข้อมูลใน Excel ที่ประกอบด้วยข้อมูลลูกค้ารายปีสำหรับค่าที่แตกต่างกันสองค่า ข้อมูลถูกจัดให้มีแถวแยกต่างหากสำหรับมูลค่าสำหรับทุกปีและลูกค้า มันดูเหมือนว่านี้:

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

ฉันติดแถวสำหรับลูกค้า 1 สำหรับค่า A ในปี 2009 และแถวแยกสำหรับค่า B สำหรับลูกค้าเดียวกันในปีเดียวกัน

ในบางกรณีไม่มีค่า A หรือค่า B ในตัวอย่างข้างต้นคุณจะเห็นว่าลูกค้า 1 ไม่มีค่า B ในปี 2011 ดังนั้นจึงไม่มีการสร้างแถวสำหรับสิ่งนั้น และแม้ว่าจะไม่ได้แสดงในตัวอย่างลูกค้าบางรายจะไม่มีข้อมูลสำหรับค่าใดค่าหนึ่งในหนึ่งปี (และไม่มีแถวสำหรับลูกค้ารายนั้นในปีนั้น) ในสถานการณ์ดังกล่าวการขาดแถวสำหรับลูกค้ารายนั้นในปีนั้นถือว่าใช้ได้

ฉันต้องการนำสิ่งนี้ลงในแผ่นงานที่มีแถวหนึ่งแถวสำหรับทั้งค่าสำหรับทุกปีและลูกค้า คือฉันต้องการให้ข้อมูลมีลักษณะเช่นนี้:

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

วิธีที่มีประสิทธิภาพที่สุดในการสร้างผลลัพธ์นั้นคืออะไร

คำตอบ:


6

นี่คือ VBA หรือแมโครที่คุณสามารถเรียกใช้บนแผ่นงานของคุณ คุณต้องกดalt+ F11เพื่อแสดงพร้อมท์ Visual Basic สำหรับแอปพลิเคชันไปที่สมุดงานของคุณright click - insert - moduleและวางรหัสนี้ในนั้น จากนั้นคุณสามารถเรียกใช้โมดูลจากภายใน VBA F5โดยการกด มาโครนี้ชื่อ "ทดสอบ"

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

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

แก้ไข - เป็นไปได้ทั้งหมดที่ฉันwith statementไม่มีความจำเป็นอย่างสมบูรณ์ แต่ก็ไม่ได้ทำร้ายใคร ..

ปรับปรุงแล้ว 02/28/14

มีคนใช้คำตอบนี้ในคำถามอื่นและเมื่อฉันกลับไปฉันคิดว่า VBA นี้แย่ ฉันได้ทำมันใหม่ -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

เยี่ยมชม 05/04/16

ถามอีกครั้งวิธีการรวมค่าจากหลายแถวเป็นแถวเดียว? มีโมดูล แต่ต้องการตัวแปรอธิบายและอีกครั้งมันแย่มาก

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

อย่างไรก็ตามขึ้นอยู่กับปัญหามันอาจจะดีกว่าที่จะstep -1อยู่บนหมายเลขแถวจึงไม่มีอะไรถูกข้ามไป

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub

2

ตัวเลือกอื่น:

  1. เลือกคอลัมน์ B กดCTRL+G-> Special-> Blanks->OK
  2. พิมพ์=กดแล้วCTRL+ENTER
  3. เลือกคอลัมน์ C กดCTRL+G-> Special-> Blanks->OK
  4. พิมพ์=IF(กดชนิด=กดกดชนิด,กดชนิด,0)แล้วCTRL+ENTER
  5. เลือกข้อมูลทั้งหมดCopyและPaste Special as Values
  6. ลบรายการซ้ำ

แก้ไข:

คำอธิบาย:ฉันพยายามใช้ประโยชน์จากตัวเลือกGoTo Blanks เมื่อคุณเลือกช่องว่างแล้วคุณสามารถป้อนสูตรเดียวกันสำหรับเซลล์ว่างที่เลือกทั้งหมด เกี่ยวกับคำถามของ OP ข้อมูลดูเหมือนว่ามีช่องว่างที่สอดคล้องกันเช่น: Value Aคอลัมน์ว่างมีเหมือนCustomerIDแถวที่ไม่ใช่ช่องว่างด้านบน ในทางเดียวกันValue Bช่องว่างของคอลัมน์จะเหมือนกับCustomerIDแถวที่ไม่ใช่ช่องว่างด้านล่าง


สวัสดี zx8754 คุณช่วยเพิ่มคำอธิบายบางอย่างเกี่ยวกับความคิดของคุณได้อย่างไร
nixda

@nixda คำอธิบายถูกเพิ่มขออภัยคิดว่าขั้นตอนนั้นชัดเจนเพียงพอ
zx8754

0

วิธีที่มีประสิทธิภาพที่สุดในการทำเช่นนี้คือการทิ้งข้อมูลทั้งหมดลงในตาราง Pivot และวาง 'ลูกค้า' ลงในป้ายชื่อแถวแล้วติดตามด้วยคอลัมน์อื่น ๆ คุณสามารถวาง 'ปี' ลงในส่วนหัวของคอลัมน์หากคุณต้องการดูรายละเอียดตามปี

ตาราง Pivot อยู่ในส่วนแทรกใน Excel 2010


คุณจะพบปัญหากับเซลล์ที่ไม่มีค่าในคอลัมน์ B เนื่องจาก Excel จะไม่มีทางรู้ว่าค่าใน B2 และ B3 นั้นเกี่ยวข้องกัน
xXPhenom22Xx

ฉันยอมรับว่ามีประสบการณ์น้อยกับ Pivot Tables แต่ฉันไม่คิดว่า Pivot Tables แก้ปัญหาที่ฉันมี ฉันต้องการข้อมูลสำหรับค่าทั้งหมดสำหรับลูกค้าในหนึ่งแถวต่อปีเพื่อให้สามารถจัดการกับมันได้ (เช่นสร้างคอลัมน์เพิ่มมูลค่า A + ค่า B) ไม่ใช่แค่เปลี่ยนวิธีที่ฉันดูผ่าน Pivot Table ฉันต้องการให้ข้อมูลมีโครงสร้างแตกต่างกันในแผ่นงานอย่างแท้จริง
Greg R.

ใช่แล้วจะเป็นเรื่องยากเว้นแต่คุณจะมีคอลัมน์สลับกับข้อมูลที่หายไปอย่างที่คุณทำในตัวอย่าง หากไม่ใช่กรณีนี้ไม่มีวิธีที่ Excel จะทำสิ่งที่คุณต้องการได้เช่นกัน
xXPhenom22Xx

Greg - คุณสามารถแก้ปัญหาดังกล่าวได้: เมื่ออยู่ในตาราง pivot ในรูปแบบที่คุณต้องการให้คัดลอกออกจากตาราง pivot ไปยังตำแหน่งอื่น (แผ่นเดียวกันหรืออีกอันหนึ่ง) - จากนั้นคุณสามารถจัดการได้ทุกอย่างที่คุณต้องการ รวมถึงการเพิ่มคอลัมน์สูตร ฯลฯ
yosh m

0

นี่คือขั้นตอนในการสร้างตารางแยกต่างหากด้วยข้อมูลย่อ

  1. คัดลอกตารางทั้งหมดของคุณและวางลงบนแผ่นงานใหม่
  2. เลือกตารางใหม่ของคุณและลบซ้ำ (ข้อมูลริบบิ้น -> ลบซ้ำ) ในคอลัมน์และCustomer Yearสิ่งนี้จะให้กรอบสำหรับตารางย่อ
  3. ใน B2 (รายการแรกสำหรับValue A) ป้อนข้อมูลต่อไปนี้:

    =IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")

    ป้อนสูตรเป็นสูตรอาร์เรย์โดยการกดCtrl+ +ShiftEnter

  4. เติมสูตรลงในคอลัมน์ จากนั้นกรอกเพื่อเติมValue Bคอลัมน์เช่นกัน Voila!

หมายเหตุเล็กน้อย:

  • แน่นอนคุณจะต้องปรับที่อยู่ให้พอดีกับข้อมูลของคุณ สำหรับการอ้างอิง Sheet1 เป็นข้อมูลดั้งเดิมในคอลัมน์ A ถึง D
  • ฉันสมมติว่าข้อมูลของคุณ (หรือส่วนหัว) เริ่มต้นที่แถว 1 ซึ่งอาจเป็นจริงได้หากนี่เป็นการถ่ายโอนข้อมูล สูตรจะต้องได้รับการปรับถ้าไม่ใช่ในกรณีนี้
  • ฉันสมมติว่าตารางของคุณมีน้อยกว่าหนึ่งล้านแถว หากคุณมีมากกว่านั้นให้เปลี่ยนค่า1000000ในสูตรเป็นจำนวนที่มากกว่าจำนวนแถวของคุณ
  • หากตารางของคุณมีหลายพันแถว (100,000+) คุณอาจต้องการพิจารณาใช้โซลูชัน VBA แทนเนื่องจากสูตรอาร์เรย์สามารถจมลงด้วยอาร์เรย์ขนาดใหญ่

0

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

ในตัวอย่างที่คุณให้ไว้ข้างต้นวางฟังก์ชัน (4) เหล่านี้ลงในเซลล์, E2, F2, G2 และ H2 ตามลำดับ (ฟังก์ชัน F&G อ้างอิงเซลล์ด้านบน):

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

ลากสูตรเหล่านี้ไปให้ไกลที่สุดเท่าที่จำเป็น มันสร้างแถวข้อมูลเดียวในแต่ละครั้งที่มีแถว 2 แถวทำให้ไม่ได้รับผลกระทบแถวเดี่ยว วางค่าพิเศษ (เพื่อลบสูตร) ​​ของคอลัมน์ EFGH ที่อื่นและเรียงลำดับตามลูกค้าเพื่อลบแถวพิเศษทั้งหมด

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