Tuesday, December 17, 2019

Excel VB Script พิมพ์รายชื่อคนแยกตามกลุ่มแผนกลูกค้า และ breakpage คนสุดท้าย Download

สำหรับคนที่มีปัญหาต้องการให้ Excel พิมพ์รายชื่อลูกค้าแยกตามหน่วยซึ่งอาจจะเป็น สังกัด แผนก หรือ แยกตามหน่วยด้วยรหัสอื่นๆ วันนี้เรามีวิธีเขียน VB เพื่อให้คนที่ต้องการพิมพ์รายชื่สมาชิกแยกตามแผนกโดยจะทำการใส่ breakpage เพื่อขึ้นหน้าใหม่ให้ด้วย ก่อนอื่นเราไปดูข้อมูลตัวอย่างกันก่อน


ลำดับ เลขทะเบียน ชื่อ - สกุล สังกัด
1 000009 000001-names 000-001
2 000114 000002-names 000-001
3 000148 000003-names 000-001
4 000467 000004-names 000-001
5 000567 000005-names 000-001
6 000618 000006-names 000-001
7 000619 000007-names 000-001
8 000625 000008-names 000-001
9 000626 000009-names 000-001
10 000635 0000010-names 000-001
11 000824 0000011-names 000-001
12 000830 0000012-names 000-001
13 000947 0000013-names 000-001
14 000952 0000014-names 000-001
1 000001 000001-names 000-002
2 000005 000002-names 000-002
3 000007 000003-names 000-002
4 000016 000004-names 000-002
1 001848 000001-names 000-003
2 001987 000002-names 000-003
3 002397 000003-names 000-003
4 002835 000004-names 000-003
5 002857 000005-names 000-003
6 003111 000006-names 000-003
7 003675 000007-names 000-003
8 003814 000008-names 000-003

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


การประชุมใหญ่สามัญประจำปี 2562
รายชื่อลูกค้า หน่วย‚000-001
ลำดับ เลขทะเบียน ชื่อ - สกุล เลขประจำตัวประชาชน ลายเซ็น ลายเซ็นอีกครั้ง
1 000009 000001-names 0000000000000
2 000114 000002-names 0000000000000
3 000148 000003-names 0000000000000
4 000467 000004-names 0000000000000
5 000567 000005-names 0000000000000
6 000618 000006-names 0000000000000
7 000619 000007-names 0000000000000
8 000625 000008-names 0000000000000
9 000626 000009-names 0000000000000
10 000635 0000010-names 0000000000000
11 000824 0000011-names 0000000000000
12 000830 0000012-names 0000000000000
13 000947 0000013-names 0000000000000
14 000952 0000014-names 0000000000000


การประชุมใหญ่สามัญประจำปี 2562
รายชื่อลูกค้า หน่วย‚000-002
ลำดับ เลขทะเบียน ชื่อ - สกุล เลขประจำตัวประชาชน ลายเซ็น ลายเซ็นอีกครั้ง
1 000001 000001-names 0000000000000
2 000005 000002-names 0000000000000
3 000007 000003-names 0000000000000
4 000016 000004-names 0000000000000



การประชุมใหญ่สามัญประจำปี 2562
รายชื่อลูกค้า หน่วย‚000-003
ลำดับ เลขทะเบียน ชื่อ - สกุล เลขประจำตัวประชาชน ลายเซ็น ลายเซ็นอีกครั้ง
1 001848 000001-names 0000000000000
2 001987 000002-names 0000000000000
3 002397 000003-names 0000000000000
4 002835 000004-names 0000000000000
5 002857 000005-names 0000000000000
6 003111 000006-names 0000000000000
7 003675 000007-names 0000000000000
8 003814 000008-names 0000000000000

ปัญหาคืออะไร ใช้ print title แทนไม่ได้ เหรอ
-ไม่สามารถเปลี่ยนปริ้นไตเติ้ลแสดงตามหน่วยได้ รายชื่อลูกค้า หน่วย‚000-001 หรือ รายชื่อลูกค้า หน่วย‚000-002 ถ้าใช้ปริ้นไตเติ้ล มันจะใช้หัวเรื่องเหมือนกันหมด
- ต้องมาในใส่ break page ในแต่ละ หน่วยของลูกค้า ถ้าไม่เซนต์มันจะพิมพ์ต่อกันมาเรื่อยๆ

แก้ปัญหาด้วยมือ
- ทำการ copy หัวตารางไปใส่ไว้บนรายชื่อลูกค้าคนแรก และทำการใส่ Page Break เพื่อขึ้นหน้าใหม่ไว้ในลูกค้ำลำดับสุดท้าย ซึ่งปัญหาคือกรณมีลูกค้าเป็น 10,000 คน มีลูกค้าหลายๆหน่วย หรือหลายจังหวัด หลายตำบล ต้องมาแยกพิมพ์ การ copy ทำด้วยมือโอกาสผิดพลาดสูง ตาลายมาก

แก้ปัญหาง่ายๆ
- ปัญหาทั้งหมดที่กล่าวมาสามารถใช้คำสั่ง VB เขียนได้


หลักการทำงานของคำสั่ง VB ที่เขียนทำอย่างไรบ้าง
- เช็คว่าเป็นการพิมพ์ครั้งแรกหรือไม่ถ้าใช่ให้พิมพ์หัวตารางก่อน
- ในหัวตารางจะมีการดึงหน่วยงานของรายชื่อลูกค้าคนแรกออกมาคือคอลัม สังกัด นั่นเอง
- พิมพ์รายชื่อลูกค้าออกมา
- ทำการเช็คค่าว่ามีการขึ้นหน้าใหม่หรือไม่ ในโค้ด VB กำหนดการขึ้นหน้าใหม่ 25 record หรือ เมื่อลูกค้าเป็นคนสุดท้ายของกลุ่ม
- เช็คว่าเป็นคนสุดท้ายของกลุ่มนั้นหรือไม่ โดยเช็คจากคอลัมน์ลำดับปัจจุบัน เทียบกับคอลัมลำดับใน cell ต่อไป ถ้าลำดับปัจจุบันมีค่ามากกว่าแสดงว่าคนนี้เป็นคนสุดท้าย

เมื่อรันโปรแกรมแล้วเราจะได้แต่รายชื่อลูกค้าที่แยกตามแผนก และมีการขึ้นหน้าใหม่ด้วยคำสั่ง Break Page ตามภาพนี้
ใช้คำสั่ง vb ใน excel พิมพ์ รายชื่อลูกค้าตามหน่วยแยกจังหวัด


เมื่อรายชื่อลูกค้าถึงคนสุดท้ายแล้ว จะใส่ break page ให้
เมื่อลูกค้าพิมพ์ถึงคนสุดท้ายจะใส่ break page และทำการเพิ่มหัวตารางให้ใหม่ ง่ายๆ ปีถัดไปก็เอา cell รายชื่อมาวางไว้ที่ sheet1 และเอาโค้ดวางไว้ sheet2 ก็รันได้เลยทีนี้ก็เร็วแล้ว จะยากเฉพาะตอนเขียนโค้ด


คำสั่งเขียนโค้ด VB ที่สำคัญ

คำสั่งใส่ Break page
Worksheets("Sheet2").Rows(Pnext).PageBreak = xlPageBreakManual

คำสั่งผสานเซลล์
Worksheets("Sheet2").Range("A2:F2").Merge

นอกนั้นก็เป็นคำสั่งพื้นฐานที่น่าจะเข้าใจกันแล้ว สำหรับคนที่นึกภาพไม่ออกก็ลองเอาตัวไฟล์ excel นี้ไปรันได้เลย

ดาวน์โหลดไฟล์ตัวอย่าง

-ข้อควรระวัง
ก่อนการรันทุกครั้งต้องเคลียร์ page break, clear content, unmerg cell ทั้ง sheet ที่ 2 จึงจะสามารถรันได้แบบไม่เออเร่อ ไม่งั้นมันจะแจ้งเตือน error

การรันไฟล์ให้ไปที่แทบ
Developer ->Visual Basic -> กัดปุ่มรันสีเขียวหรือกด F5

หวังว่าตัวอย่างนี้จะเป็นประโยชน์สำหรับทุกท่านครับ มีเวลาจะถ่ายวีดีโอให้ดูครับผม