
จริง ๆแล้ว เราสามารถทำได้ 2 วิธีหลักๆ นะคะ คือการ “ย้ายหรือคัดลอก” (Move or Copy) ทีละชีทด้วยมือ หรือใช้ VBA (Macro) เพื่อแยกชีททั้งหมดอัตโนมัติค่ะ คือ
🎯 วิธีที่ 1: ย้ายหรือคัดลอกทีละชีท (วิธี Manual)
วิธีนี้เหมาะสำหรับไฟล์ที่มีจำนวนชีทไม่มาก (เช่น 2-10 ชีท) เพราะทำได้ง่ายและไม่ต้องยุ่งกับโค้ดค่ะ
- เปิดไฟล์ Excel ต้นฉบับของคุณ
- ไปที่ชีทที่คุณต้องการแยก คลิกขวาที่แท็บชื่อชีท (เช่น “Sheet1”)
- เลือกเมนู “ย้ายหรือคัดลอก…” (Move or Copy…)
- ในหน้าต่าง “ย้ายหรือคัดลอก” ที่เด้งขึ้นมา:
- ตรงช่อง “ไปยังสมุดงาน:” (To book:) ให้คลิกเลือก “(สมุดงานใหม่)” ((new book))
- (สำคัญ) ถ้าคุณต้องการให้ชีทนี้ หายไป จากไฟล์เดิม (คือการ “ย้าย”) ก็กด OK ได้เลย แต่ถ้าคุณต้องการแค่ สำเนา ชีทนี้ไปไฟล์ใหม่ โดยที่ไฟล์เดิมยังมีชีทนี้อยู่ครบ (คือการ “คัดลอก”) ให้ติ๊กเครื่องหมายถูกที่ “สร้างสำเนา” (Create a copy) ก่อน
- กด “OK”
- Excel จะเปิดหน้าต่างใหม่ขึ้นมา เป็นไฟล์ใหม่ที่มีแค่ชีทที่คุณเลือกเพียงชีทเดียว
- ไปที่ File > Save As… (ไฟล์ > บันทึกเป็น…) เพื่อบันทึกไฟล์ใหม่นี้เป็นไฟล์ .xlsx ตามชื่อที่คุณต้องการ
- กลับไปทำซ้ำขั้นตอนที่ 2-7 กับชีทอื่นๆ ที่เหลือจนครบ (อันนี้ครูจินต์รู้สึกว่ามันใช้เวลามาก เลยไม่แนะนำค่ะ แต่ถ้าใครที่ชอบวิธีนี้ ก็สามารถทำได้ค่ะ)
🚀 วิธีที่ 2: ใช้ VBA (Macro) (วิธีอัตโนมัติ)
วิธีนี้เหมาะสำหรับไฟล์ที่มีชีทจำนวนมาก (เช่น 10 ชีทขึ้นไป) จะช่วยประหยัดเวลาได้มหาศาลเลยค่ะ
ข้อควรระวัง: ควรสำรองข้อมูล (Backup) ไฟล์ต้นฉบับของคุณไว้ก่อนรัน Macro เสมอค่ะ
- เปิดไฟล์ Excel ต้นฉบับที่คุณต้องการแยกชีท
- กดปุ่ม
Alt + F11เพื่อเปิดหน้าต่าง VBA Editor (Visual Basic for Applications) - ที่เมนูด้านบน คลิก Insert > Module (จะมีหน้าต่างโค้ดว่างๆ สีขาวเปิดขึ้นมาทางขวา)
- คัดลอก (Copy) โค้ดด้านล่างนี้ ไปวางในหน้าต่าง Module (หน้าสีขาว) นั้น
Sub SplitSheetsToNewFiles()
Dim ws As Worksheet
Dim OriginalWorkbook As Workbook
Dim NewWorkbook As Workbook
Dim FilePath As String
' ตั้งค่าไฟล์ต้นฉบับ
Set OriginalWorkbook = ActiveWorkbook
' หาตำแหน่งที่อยู่ของไฟล์ต้นฉบับเพื่อใช้เป็นที่บันทึกไฟล์ใหม่
FilePath = OriginalWorkbook.Path
' ตรวจสอบว่าไฟล์หลักถูกบันทึกหรือยัง
If FilePath = "" Then
MsgBox "กรุณาบันทึกไฟล์หลักของคุณก่อนรันสคริปต์นี้", vbInformation, "ยังไม่ได้บันทึก"
Exit Sub
End If
Application.ScreenUpdating = False ' ปิดการอัปเดตหน้าจอเพื่อความเร็ว
' วนลูปทำซ้ำทุกชีทในไฟล์ต้นฉบับ
For Each ws In OriginalWorkbook.Worksheets
' คัดลอกชีทปัจจุบันไปสร้างไฟล์ใหม่
ws.Copy
' ตั้งค่าไฟล์ใหม่ที่เพิ่งถูกสร้าง
Set NewWorkbook = ActiveWorkbook
' พยายามบันทึกไฟล์ใหม่โดยใช้ชื่อเดียวกับชื่อชีท
' และบันทึกไว้ในโฟลเดอร์เดียวกับไฟล์ต้นฉบับ
On Error Resume Next ' จัดการกรณีชื่อชีทมีอักขระพิเศษที่ใช้ตั้งชื่อไฟล์ไม่ได้
NewWorkbook.SaveAs Filename:=FilePath & "\" & ws.Name & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook ' บันทึกเป็น .xlsx
On Error GoTo 0
' ปิดไฟล์ใหม่ที่เพิ่งบันทึกไป
NewWorkbook.Close SaveChanges:=False
Next ws
Application.ScreenUpdating = True ' เปิดการอัปเดตหน้าจอคืนค่าเดิม
MsgBox "แยกไฟล์ทั้งหมดเรียบร้อยแล้ว!"
End Sub
5. คลิกที่ใดก็ได้ในโค้ด แล้วกดปุ่ม F5 (หรือกดปุ่ม Play ▶ สีเขียว บนแถบเครื่องมือ) เพื่อรันสคริปต์
6. รอสักครู่… เมื่อเสร็จแล้ว จะมีข้อความแจ้งว่า “แยกไฟล์ทั้งหมดเรียบร้อยแล้ว!”
7. ไฟล์ใหม่ๆ ที่ถูกแยกออกมา (ไฟล์ละ 1 ชีท) จะถูกบันทึกไว้ในโฟลเดอร์เดียวกับไฟล์ต้นฉบับของคุณ โดยใช้ชื่อชีทเป็นชื่อไฟล์ค่ะ
📑 การเพิ่มปุ่ม “Developer” (นักพัฒนา)
นี่คือวิธีมาตรฐานอีกวิธีในการเปิด VBA Editor ค่ะ
- ดูที่แถบเมนู (Ribbon) ด้านบนของ Excel (ที่มี File, Home, Insert, …) ว่ามีแท็บ “Developer” (นักพัฒนา) หรือไม่
2. ถ้ามีแท็บ “Developer”: ให้คลิกที่แท็บนั้น แล้วมองหาปุ่มแรกทางซ้ายสุดที่ชื่อ “Visual Basic” (ที่เป็นรูปไอคอนโค้ด)
3. ถ้าไม่มีแท็บ “Developer”: คุณต้องเปิดใช้งานก่อน โดยไปที่:
- File (ไฟล์) > Options (ตัวเลือก)
- เลือก Customize Ribbon (กำหนดแถบเครื่องมือเอง)
- ในช่องทางขวา (Main Tabs) ให้ติ๊กเครื่องหมายถูกที่หน้า “Developer” (นักพัฒนา)
- กด OK แล้วกลับไปทำตามขั้นตอนที่ 2