ฉันจะรวมสองตารางใน Excel ที่มีคอลัมน์เหมือนกันได้อย่างไร


11

ใน Excel ฉันมีสเปรดชีตที่ดึงข้อมูลจากฐานข้อมูล SQL ลงในตารางแล้วสร้างรายงานตามข้อมูลนั้น น่าเสียดายที่ข้อมูลในฐานข้อมูล SQL นี้ไม่สมบูรณ์และฉันต้องการรวมแถวเพิ่มเติมในชุดผลลัพธ์ที่ป้อนด้วยตนเองลงในสเปรดชีต

เท่าที่ฉันต้องการฉันไม่สามารถแทรกแถวพิเศษเหล่านี้ลงในตารางได้ด้วยตนเองเพราะจะถูกลบเมื่อใดก็ตามที่ Excel ดึงข้อมูลใหม่จากฐานข้อมูล SQL ดังนั้นฉันจึงพิจารณาสร้างตารางแยกเป็นส่วนหัวคอลัมน์เดียวกันบนแผ่นงานใหม่และป้อนข้อมูลที่นั่นแล้วสร้างตารางที่สามบนแผ่นงานอื่นที่รวมแถวจากตารางที่ดึงข้อมูลจาก SQL และ ตารางที่ฉันป้อนข้อมูลด้วยตนเอง ฉันจะทำสิ่งนี้ได้อย่างไร (หรืออีกวิธีหนึ่งมีวิธีที่ดีกว่าในการทำสิ่งนี้ที่ฉันหายไปอย่างใด?)


ตัวอย่าง:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

-

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

-

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

มันจะโอเคไหมถ้าข้อมูลที่คุณเพิ่มด้วยตนเองต่ำกว่าข้อมูล SQL ของคุณ? หรือพวกเขาจะต้องเรียงตามวันที่ Excel จะไม่เขียนทับแถวที่อยู่ด้านล่างของแถวข้อมูล SQL ที่มีอยู่ แต่ถ้าหากต้องจัดเรียงข้อมูลทั้งสองประเภทสิ่งนั้นจะซับซ้อนกว่ากันทั้งหมด
nixda

ฉันต้องการให้พวกเขาเรียงลำดับ แต่ไม่จำเป็นอย่างสมบูรณ์ สิ่งสำคัญคือฉันสามารถใช้ตารางสาระสำคัญและเครื่องมือ excel อื่น ๆ เพื่อวิเคราะห์ชุดข้อมูลทั้งหมด (รวมถึงตารางทั้งแบบแมนนวลและแบบอัตโนมัติ) ฉันยังต้องสามารถดึงข้อมูลใหม่จาก SQL โดยอัตโนมัติ
Ajedi32

พฤติกรรมนี้จะเป็นทางออกหรือไม่? หลังจากแบบสอบถามครั้งแรกและหลังแบบสอบถามที่สอง และแน่นอนว่า Excel จะอัปเดต SQL ของคุณโดยอัตโนมัติเมื่อคุณเปิดเวิร์กบุ๊ก
nixda

ฉันจะเดาได้ ฉันควรมีข้อมูลในตารางเดียวเพื่อให้ฉันสามารถกรองเรียงลำดับและอื่น ๆ แต่เหมือนที่ฉันพูดก่อนหน้านี้ว่าไม่จำเป็นทั้งหมด
Ajedi32

บางทีเราอาจหาวิธีแก้ปัญหาการเรียงลำดับของคุณ แต่สำหรับขั้นตอนแรกเพียงสอบถาม SQL ของคุณเป็นครั้งแรกในสมุดงานใหม่ หลังจากนั้นเพิ่มรายการคู่มือของคุณด้านล่าง ตอนนี้ทดสอบด้วยแบบสอบถามที่สอง (และมากกว่า) พวกเขาจะไม่ถูกเขียนทับ มันเป็นพฤติกรรมมาตรฐาน ไม่มีอะไรพิเศษที่ต้องทำ
nixda

คำตอบ:


2

นี่เป็นโซลูชัน Excel ที่ไม่มี VBA มันทำงานโดยใช้ฟังก์ชัน INDEX เพื่อลดจำนวนแถวและข้ามคอลัมน์ของข้อมูล SQL จนกว่าค่าจะหมดและผลลัพธ์เงื่อนไขข้อผิดพลาด ฟังก์ชัน IFERROR จับข้อผิดพลาดและใช้ฟังก์ชัน INDEX ที่สองเพื่อลดแถวและข้ามคอลัมน์ของข้อมูลที่ป้อนด้วยตนเองอีกครั้งจนกว่าค่าเหล่านั้นจะหมดลงและผลลัพธ์เงื่อนไขข้อผิดพลาด ฟังก์ชัน IFERROR ที่สองจับข้อผิดพลาดและคืนค่าขีดกลาง ("-") (ข้อมูล SQL จะต้องรีเฟรชผ่าน Ribbon เพื่อให้สูตรสร้างผลลัพธ์ที่ถูกต้อง)

สร้างช่วงไดนามิกชื่อ SQLDB สำหรับข้อมูล SQL ใน Sheet1 โดยใช้สูตร:

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

สร้างช่วงไดนามิกที่สองตั้งชื่อช่วง EXCELRNG สำหรับข้อมูลที่ป้อนด้วยตนเองใน Sheet2 โดยใช้สูตร:

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

ช่วงที่มีชื่อทั้งสองนี้สมมติว่าชื่อตัวแปรถูกป้อนในแถว 1 ของแต่ละแผ่นงานสองแผ่น

ป้อนชื่อตัวแปรในแถวที่ 1 ของ Sheet3 (เริ่มต้นในเซลล์ A1)

ป้อนสูตรต่อไปนี้ในเซลล์ A2 ของ Sheet3:

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

คัดลอกสูตรไปยังคอลัมน์ชื่อตัวแปรจากนั้นกดแถวจนกระทั่งผลลัพธ์ของสูตรเป็นเส้นประทั้งหมด ("-")

เป็นไปได้ในขั้นตอนต่อไปในการสร้าง Pivot Table ในชีตอื่นสำหรับการวิเคราะห์และการจัดระเบียบ

อีกครั้งขั้นตอนแรกคือการสร้างช่วงไดนามิกที่มีชื่อพูด RESULTRNG แทรกสูตรต่อไปนี้ในกล่องใส่ชื่อผู้จัดการสำหรับช่วงชื่อ:

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

จากนั้นสร้างตาราง Pivot ในแผ่นงานใหม่โดยตั้งค่า RESULTRNG เป็นตารางที่คุณต้องการวิเคราะห์ สิ่งนี้จะกรองขีดคั่นต่อท้ายจากตารางสูตรใน Sheet3

สิ่งนี้ใช้งานได้เนื่องจากสูตร RESULTRNG จะนับจำนวนแถวทั้งหมดใน Sheet1 และ Sheet2 (ยกเว้นส่วนหัวใน Sheet2) และจำนวนคอลัมน์ทั้งหมดใน Sheet1 และตั้งค่าขอบเขตตามจำนวนเหล่านั้นโดยไม่รวมขีดกลางใด ๆ ในแถวต่อท้าย ( หรือคอลัมน์) ในตารางสูตร Sheet3


ถ้าฉันทำแบบนี้แม้ว่าตารางที่รวมกันจะต้องไม่ใช่ขนาดคงที่หรือไม่ และถ้าทำให้ตารางมีขนาดใหญ่เกินกว่าที่ควรจะเป็นมันจะไม่ทำให้ฉันยุ่งหากฉันพยายามสร้าง Pivot Table ที่จัดการข้อมูลจากตารางที่รวมกันหรือไม่ (เพราะค่าบางอย่างในตารางจะเป็นอักขระ '-'?) หรือมีวิธีแก้ไขปัญหาเหล่านี้หรือไม่
Ajedi32

(Btw ฉันมักชอบโซลูชัน Excel ที่บริสุทธิ์เช่นนี้เพราะพวกเขาไม่ต้องการให้ผู้ใช้เปิดใช้งานแมโครก่อนที่พวกเขาจะเริ่มทำงาน)
Ajedi32

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

เป็นไปได้ไหมที่จะสร้างช่วงที่มีชื่ออื่นที่มีเฉพาะแถวจากตารางที่ผสานซึ่งไม่ได้ว่างเปล่า (เต็มไปด้วยอักขระ '-') ด้วยวิธีนี้ฉันสามารถตั้งค่าตารางสาระสำคัญเพื่อรับข้อมูลจากช่วงนั้นและฉันไม่ต้องกังวลกับเครื่องหมายขีดกลาง
Ajedi32

ฉันได้ขยายคำตอบเพื่ออธิบายวิธีสร้างตารางสาระสำคัญโดยไม่รวมขีดกลาง การพยายามวางตาราง "แบบไม่ต้องรีบ" จะเป็นการถ่ายโอนปัญหาเส้นประไปยังแผ่นงานอื่นโดยที่ # N / A ในเซลล์เส้นประเว้นแต่ตารางใหม่จะถูกกำหนดขนาดด้วยมือในแต่ละครั้งที่จำนวนแถวในแหล่งข้อมูลเปลี่ยนแปลง
chuff

5

ฉันพบวิธีการทำ วิธีนี้เป็นเรื่องยุ่งยากเล็กน้อยและต้องการให้ทั้งสองตารางมีแผ่นแยกต่างหากของตัวเอง (โดยไม่มีสิ่งอื่นใดบนพวกเขา) แต่นอกเหนือจากนั้นมันก็เกือบจะตรงตามที่ฉันต้องการ (ดูเหมือนว่าจะมีศักยภาพมากมายที่นี่สำหรับการดำเนินการที่ซับซ้อนมากขึ้นเช่นการเข้าร่วม)

ไปที่แท็บข้อมูลบน ribbon คลิก "จากแหล่งข้อมูลอื่น" และ "จาก Microsoft Query" จากนั้นคลิกไฟล์ Excel เลือกไฟล์ที่คุณกำลังทำงานอยู่และคลิกตกลง จากนั้นกดปุ่มยกเลิกและเมื่อเลื่อนขั้นว่าคุณต้องการแก้ไขใน Microsoft Query ต่อไปหรือไม่ให้กด "ใช่" จากที่นี่คุณสามารถคลิกปุ่ม SQL และเขียน SQL Query ที่กำหนดเองบนแผ่นงานใด ๆ ในสเปรดชีต ในกรณีของฉัน:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

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


1
มันใช้งานได้ดีในการเชื่อมต่อเวิร์กบุคสองแบบที่ต่างกัน นั่นคือสิ่งที่ฉันต้องการ ขอบคุณ!
daVe

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

การเพิ่มเพราะสิ่งนี้เกิดขึ้นกับฉันเกือบจะใช้สิ่งนี้เพื่อรวมข้อมูลการขายจำนวนมากไว้ในสเปรดชีต 1 ก่อนที่จะทำ pivottable เพื่อให้ได้ยอดรวมบางส่วนและฉันจะได้รับข้อผิดพลาดเล็กน้อยที่ปริมาณการขายผลิตภัณฑ์เดียวกัน พลาดแล้ว
Some_Guy

@Some_Guy เพียงใช้ UNION ALL แทน
Ajedi32

3

หากคุณสนใจโซลูชัน VBA ฉันสามารถทำงานต่อไปนี้ได้:

  • ตั้งช่วงแบบไดนามิกที่มีชื่อสำหรับข้อมูลที่คุณดึงจาก SQL Server เปิดตัวจัดการชื่อให้ป้อนชื่อใหม่ (พูด "SQLDB") และคัดลอกสูตรต่อไปนี้ในกล่องใส่อ้างอิงถึง ฉันสันนิษฐานว่าข้อมูลที่ดึงเข้ามาของคุณอยู่ใน Sheet1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • ตั้งค่าช่วงที่ตั้งชื่ออื่นสำหรับช่วงที่ป้อนข้อมูลด้วยตนเอง ฉันใช้ชื่อ EXCELRNG และคิดว่ามันอยู่ใน Sheet2 ช่วงที่มีชื่อเริ่มต้นในแถว 2 เพื่อไม่รวมแถวส่วนหัว สูตรที่นี่เหมือนกันกับสูตรแรกยกเว้นแผ่นที่อ้างถึง:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • นี่เป็นชุดแรกของการตั้งค่าที่ฉันใช้สำหรับการเชื่อมต่อกับตาราง SQL กล่องโต้ตอบเข้าถึงได้โดยเลือกการเชื่อมต่อในแท็บข้อมูลบน Ribbon การปิดใช้งานการรีเฟรชพื้นหลังทำให้มั่นใจได้ว่าแมโคร VBA หยุดชั่วคราวจนกว่าการรีเฟรชข้อมูลในแผ่นงาน Excel จะเสร็จสมบูรณ์ ต้องมีการรีเฟรชการเชื่อมต่อเมื่อไม่จำเป็นต้องเปิดเวิร์กชีท แต่ฉันต้องการตรวจสอบให้แน่ใจว่ามีการตรวจสอบสิทธิ์ใด ๆ ก่อนที่จะเรียกใช้แมโคร

การตั้งค่าการเชื่อมต่อ

  • นี่เป็นการตั้งค่าชุดที่สอง พบได้ในส่วนคุณสมบัติของแท็บข้อมูล (ขณะที่เลือกเซลล์ในตาราง SQL ที่นำเข้า) แม้ว่าฉันเลือกตัวเลือก "แทรกทั้งแถวสำหรับข้อมูลใหม่ลบเซลล์ที่ไม่ได้ใช้" ตัวเลือกฉันจริง ๆ แล้วไม่ได้มีปัญหากับตัวเลือก "แทรกเซลล์ ... "

คุณสมบัติการเชื่อมต่อ

  • ในที่สุดนี่คือรหัส VBA ในการแทรกให้เลือก Visual Basic ภายใต้แท็บนักพัฒนา เน้นชื่อแผ่นงานในรายการทางด้านซ้าย มันจะถูกอ้างอิงเป็น "โครงการ VBA (ชื่อแผ่น) จากนั้นเลือกแทรกโมดูลในแถบเมนูที่ด้านบนของหน้าจอและวางรหัสในโมดูลใหม่โปรดทราบว่าฉันใส่ตารางรวมใน Sheet3 ดังที่เขียนไว้ แมโครไม่ได้เรียงลำดับตารางใหม่แม้ว่าจะไม่สามารถเพิ่มได้ยาก

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

ดูเหมือนว่าจะเป็นทางออกที่ดีทีเดียว ฉันมีคำถามสองสามข้อ อะไรเรียกแมโครนี้ มันจะทำงานโดยอัตโนมัติเมื่อคุณรีเฟรชการเชื่อมต่อข้อมูลหรือคุณต้องกดปุ่มแยกต่างหาก ประการที่สองใช้งานได้กับตารางใช่ไหม (ไม่ใช่เฉพาะช่วงที่ไม่ได้จัดรูปแบบเป็นตาราง) หากเป็นกรณีนั้นตารางจะไม่สามารถจัดการการเรียงลำดับได้หรือไม่ (แทนที่จะเป็นแมโคร VBA ทำการเรียงลำดับตามที่คุณแนะนำ?)
Ajedi32

1
คุณจะเรียกใช้แมโครโดยเลือก Macros จากแท็บ Developer จากนั้นเลือกและเรียกใช้แมโคร สองทางเลือก: กำหนดให้ปุ่มที่กำหนดเองบน Ribbon และใช้เพื่อเรียกใช้; หรือฝังเป็นรหัสแมโครในเหตุการณ์แผ่นงาน _Activate สิ่งนี้จะเรียกใช้เมื่อใดก็ตามที่คุณเลือกแผ่นการรวมบัญชี มันจะทำงานกับตารางซึ่งสามารถทำการเรียงลำดับ อย่างไรก็ตามฉันไม่แน่ใจว่าตารางจะเปลี่ยนโดยอัตโนมัติเมื่อมีการเพิ่มข้อมูลหรือไม่
chuff

3

ต่อไปนี้เป็นเวอร์ชันของโซลูชัน "Pure Excel" ของ@ chuffที่ออกแบบมาเพื่อทำงานกับตารางโดยเฉพาะ (IE แหล่งข้อมูลสองแหล่งที่คุณต้องการผสานคือตาราง)

ความแตกต่างที่สำคัญระหว่างวิธีนี้และ chuff ที่โพสต์ในคำตอบของเขาคือคุณไม่จำเป็นต้องกำหนดช่วงที่มีชื่อสำหรับชุดข้อมูลสองชุดที่คุณกำลังผสานเนื่องจากเป็นตารางและมีช่วงที่ตั้งชื่อไว้แล้ว เพื่อไปข้างหน้าและตั้งชื่อตารางแรกของคุณและโต๊ะที่สองของคุณTable1Table2

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

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

จากนั้นคัดลอกสูตรนี้ไปยังคอลัมน์ตารางทั้งหมดจากนั้นกดลงไปจนผลลัพธ์ของสูตรเป็นเส้นประทั้งหมด ("-") หมายเหตุ: การเรียงลำดับตารางใหม่นี้จะไม่ทำอะไรเลยเนื่องจากเนื้อหาของแต่ละเซลล์เหมือนกันจริง ๆ (ทั้งหมดนั้นมีสูตรเดียวกัน)

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

=SUBSTITUTE(<old expression here>, 0, "")

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

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

จากนั้นคุณสามารถใช้การอ้างอิงที่มีชื่อนี้เป็นช่วงสำหรับตาราง Pivot ของคุณ


0

หากคุณต้องการผลลัพธ์เพียงครั้งเดียวมีเว็บไซต์ที่จะรวมสองตารางให้คุณ: https://office-tools.online/table/merge/

คุณวางตารางลงในหน้าเว็บและเลือกพารามิเตอร์ที่เกี่ยวข้อง นี่คือภาพหน้าจอของตัวอย่างในตัวที่ระบุวิธีใช้:

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

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