เชิญทุกท่านที่สนใจสมัครเข้าอบรมในวันอาทิตย์ครับ ... คลิกที่นี่เพื่อดูรายละเอียดและลงทะเบียน

Arrow up
Arrow down

 

 

 

 

Excel Expert Training ให้การอบรม Excel กลุ่มเล็กๆ 1 - 6 คน เพื่อคุณจะได้รับการอบรมที่มีคุณภาพสูงสุด สามารถเรียนรู้ Excel อย่างใกล้ชิด จะมาคนเดียวหรือมาเป็นกลุ่มแล้วนัดวันอบรมแบบส่วนตัวก็ได้

ผู้เข้าอบรมทุกคนสามารถติดตามเนื้อหาที่อบรมจากจอภาพด้านหน้าของตัวเอง ดีกว่าห้องอบรมที่ใช้เครื่องฉายภาพให้เห็นเพียงจอเดียว ไม่ต้องก้มๆเงยๆเพ่งมองตัวหนังสือบนจอที่อยู่หน้าชั้นอีกต่อไป

2019XLRoomOK2 

คุณจะได้รับการถ่ายทอดความรู้และประสบการณ์จากอาจารย์สมเกียรติ ฟุ้งเกียรติ ซึ่งเชี่ยวชาญ Excel ระดับประเทศคนหนึ่งของไทย เป็นคนไทยคนแรกและคนแรกของเอเชียตะวันออกเฉียงใต้ที่ได้รับการยกย่องจากบริษัท Microsoft ให้เป็น Microsoft Excel Most Valuable Professional ติดต่อกันมากกว่า 10 ปี ซึ่งตั้งแต่ปีพ.ศ. 2542 ได้สร้างเว็บ Excel Expert Training นี้เพื่ออุทิศตนให้ความรู้ฟรีแก่สังคมเรื่อยมา

MVP13yearsAd

อาจารย์สมเกียรติเคยสร้างชื่อเสียงด้านการอบรม Excel ตั้งแต่ปีพ.ศ. 2539 - 2557 ให้กับสมาคมส่งเสริมเทคโนโลยี (ไทย-ญี่ปุ่น) เคยเป็นทั้งระดับผู้ใช้งานเองและผู้บริหารในบริษัทชั้นนำทั้งขนาดใหญ่และเล็ก จึงสามารถถ่ายทอดประสบการณ์แบบเจาะลึก และให้มุมมองได้อย่างกว้างขวาง คุณจะได้รับโอกาสเรียนรู้และสอบถามอย่างใกล้ชิดแบบหาไม่ได้จากที่ใด เคล็ดลับบางอย่างแม้ต่างชาติก็ยังไม่มีความรู้เช่นนี้
(ประวัติอาจารย์สมเกียรติ ฟุ้งเกียรติ)

EETCourseSystemWhite

คลิกที่ภาพเพื่อดูภาพขนาดใหญ่

XLStudents2019wBorder

 

Excel Expert Training Certifigate

56787border

SFK scg4 640

 

นอกจากนี้ ขอเชิญเรียนรู้ Excel ได้ฟรีจาก บทความแนะนำวิธีการใช้ Excel

ร่วมเข้ากลุ่มคนรัก Excel ได้ที่ https://www.facebook.com/groups/ThaiExcelLover 
ติดตามบทความใหม่ๆได้จาก https://www.facebook.com/ExcelExpertTraining

 

XLLovers 

Matichon 

 

 

 

 

 

  

 

 

Public Training ต่างจาก Private Training อย่างไร 

Public Training เป็นการอบรมแบบเจาะลึกเฉพาะด้านซึ่งเปิดรับทุกคนที่สนใจมาสมัครเข้าร่วมอบรมด้วยกัน มาคนเดียวก็เรียนได้ รับไม่เกินกลุ่มละ 6 คน

Private Training เป็นการอบรมแบบส่วนตัว ซึ่งจัดให้กับกลุ่ม 1 - 6 คนที่มาจากที่ทำงานเดียวกัน โดยผู้เข้าอบรมสามารถกำหนดวันอบรม เนื้อหา และระยะเวลาที่ต้องการอบรมได้เอง โดยดูวันที่ยังว่างเพื่อจองอบรมได้จาก ปฏิทินสำหรับจองอบรมแบบ Private จากนั้นติดต่ออาจารย์สมเกียรติเพื่อรีบจองวันที่ต้องการเอาไว้ก่อน


Public Training และ Private Training ซึ่ง Excel Expert Training จัดอบรมขึ้นนี้ มีประโยชน์กว่าที่อื่นอย่างมาก เพราะที่นี่จะรับจำนวนผู้เข้าอบรมไม่เกิน 6 คนต่อรอบเท่านั้น เพื่อมุ่งให้ผู้เข้าอบรมมีโอกาสได้เรียนรู้อย่างมีคุณภาพสูงสุด

ติดต่อสอบถามอาจารย์สมเกียรติ ฟุ้งเกียรติ ได้ที่โทร 097 140 5555 หรือ Excel@ExcelExpertTraining.com 

แผนที่ห้องฝึกอบรม Excel Expert Training
ซอยรามคำแหง 35

Training Manuals

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

ก่อนจะรีบร้อนกรอกอะไรลงไปในตาราง ต้องตั้งหลักไว้ว่า “สิ่งใดที่ทำลงไปในตารางจะทำไว้เพียงครั้งแรกครั้งเดียวเท่านั้น ห้ามกรอกข้อมูลซ้ำอย่างเด็ดขาด” โดยเฉพาะข้อมูลที่เป็นชื่อ เช่น ชื่อลูกค้า ชื่อสินค้า ชื่อพนักงานขาย หรือแม้แต่ชื่อที่อยู่ของบริษัทตัวเองที่พิมพ์ไว้บนหัวรายงาน เมื่อใดที่ต้องการนำชื่อเหล่านี้มาใช้แสดงในตาราง อย่าพิมพ์ซ้ำอีก แต่ให้สร้างสูตรลิงก์ดึงข้อมูลมาใช้ ซึ่งหนีไม่พ้นสูตร IF Choose And Or VLookup Match Index หรือใช้คำสั่ง Data > Validation โดยอาศัยการตั้งชื่อ Range Name ซึ่งจะทำให้สามารถดึงข้อมูลที่กรอกไว้มาใช้ข้ามชีทหรือข้ามแฟ้มได้สะดวกขึ้นมาก

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

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

ส่วนตัวข้อมูลที่ต้องนำมาใช้ซ้ำแล้วซ้ำอีกให้บันทึกไว้ในตารางฐานข้อมูล หรือตาราง Input ซึ่งแยกออกมาเป็นหลายตารางตามประเภทของข้อมูล เช่น

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

สูตรที่ยากหน่อยในการดึงข้อมูลว่าเลขที่ Invoice แต่ละใบประกอบด้วยการขายสินค้าอะไรบ้าง ต้องพึงพาสูตรที่เรียกว่า สูตร Multiple Match แนะนำให้ Download นำตัวอย่างนี้ไปแกะกัน

https://drive.google.com/open?id=1rEJNzml3BXbbffCHcjFUDX4ymtS6oMIe

Northwind

ตัวอย่างนี้เป็นตัวอย่างในโปรแกรม Microsoft Access ซึ่งผมลอกนำมาแสดงให้ดูว่า หากจะนำ Excel มาประยุกต์ใช้ก็ทำได้เช่นกัน ใช้เป็นตัวอย่างประกอบหลักสูตรหันมาใช้ Excel จัดการฐานข้อมูลแทน Access กันดีกว่า

ชมวิดีโอได้จาก

https://www.excelexperttraining.com/forum/articles/managing-excel-articles/249-managing-data-with-excel-expert-training

Data > SubTotal ใช้กับตารางฐานข้อมูลซึ่งจัดเรียงข้อมูลแยกตามกลุ่มที่ต้องการไว้ก่อนแล้วและต้องเป็นตารางซึ่งไม่มีสูตรใดๆสร้างไว้ เมื่อใช้คำสั่งนี้จะเกิดสูตร SubTotal หายอดรวมแยกตามกลุ่มให้ทันที พร้อมกับสร้าง Outline เพื่อใช้คลิกเลือกแสดงรายละเอียดทีละขั้นตามต้องการให้อีก และเมื่อนำมาใช้งานร่วมกับ Custom Views จะเป็นเครื่องมือใช้ช่วยงานฐานข้อมูลได้อย่างไม่น่าเชื่อ

เริ่มจากจัดเรียงข้อมูลเพื่อจัดกลุ่มข้อมูลที่ต้องการหายอดรวม แยกเฉพาะแต่ละกลุ่มก่อน โดยสั่ง Data > Sort จากนั้นคลิกลงในตารางข้อมูลเซลล์ใดก็ได้ แล้วสั่ง Data > Subtotal

image047

  • ช่อง At each change in: ให้เลือกชื่อ Header ที่ต้องการหาผลรวมตามกลุ่มของ Header นั้นๆ
  • ช่อง Use function: ให้เลือก Sum
  • ช่อง Add subtotal to: ให้เลือกชื่อ Header ของ Field ที่ต้องการหายอดรวม
  • กดปุ่ม OK จะพบว่า มี Row ใหม่แทรกขึ้นเองและมีสูตร Subtotal คำนวณยอดให้ทันที

หากต้องการสร้าง Subtotal ระดับรองซ้อน Subtotal ระดับแรก ให้สั่ง Data > Subtotal ซ้ำอีกครั้งแล้วเปลี่ยน Header ใหม่ในช่อง At each change in: แล้วให้ตัดกาเครื่องหมายถูกในช่อง Replace current subtotals ออก แล้วกด OK

image048

เมื่อกดปุ่มเครื่องหมายลบหรือปุ่มหมายเลขระดับชั้นของ Outline ด้านบนซ้าย รายการข้อมูลจะหุบ และปุ่ม Outline จะกลายเป็นเครื่องหมายบวกแทน หากต้องการ Copy เฉพาะ Visible Cells ให้เลือกพื้นที่ตารางแล้วกด F5 > Special > เลือก Visible cells only จากนั้นสั่ง Copy ไป Paste จะได้เฉพาะพื้นที่ที่เหลือจากการกดปุ่ม Outline เท่านั้น

ข้อดีของการใช้คำสั่งนี้ นอกจาก Excel จะสร้างสูตร SubTotal ให้เองแล้ว หากต้องการสั่งย้อนกลับไปเป็นตารางฐานข้อมูลตามแบบเดิม ให้กดปุ่ม Remove All

หมายเหตุ หากต้องการสร้าง Outline ขึ้นมาใช้เอง ให้เลือกเซลล์ที่ต่อเนื่องกันแล้วใช้คำสั่ง Data > Group

Download ตัวอย่างได้จาก
https://drive.google.com/open?id=1keniOvMRhXbW5fgAEA08qqbfgGeRmb5m

https://youtu.be/i_59z1ogr64

 

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

CircWarning

CircWarningBtm

คำเตือนยาวที่ปรากฏบนกลางจอว่า There are one or more circular references where a formula refers to its own cell either directly or indirectly. ... Try removing or changing these references, or moving the formulas to different cells. เป็นคำเตือนที่อาจจะเกิดขึ้นตอนที่เปิดแฟ้มหรือตอนที่สร้างสูตรลงไปในเซลล์ หลังจากที่กดปุ่ม OK แล้วจะมีคำเตือนที่มุมซ้ายล่างของจอปรากฏขึ้นแทนว่า Circular References: ตามด้วยตำแหน่งเซลล์

“การกำหนดตำแหน่งอ้างอิงแบบวงกลมอาจจะทำให้ Excel คำนวณผิดพลาด” นี่เป็นประเด็นสำคัญของคำเตือนที่แสดงขึ้นบนจอ

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

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

ตัวอย่างการสร้างสูตรที่มีตำแหน่งอ้างอิงแบบวงกลมที่ง่ายที่สุด เช่น ในเซลล์ A1 สร้างสูตร =A1 ลงไป หรือในเซลล์ B3 สร้างสูตร = B1+B2+B3 ลงไป หรือสังเกตง่ายๆว่าสูตรในเซลล์ใดมีตำแหน่งอ้างอิงที่ระบุถึงเซลล์นั้นเองอยู่ด้วย ซึ่งนอกจากนี้หากมีสูตรที่ link ต่อๆกันไปหลายๆเซลล์แล้วกลับส่งค่ากลับมาในเซลล์ใดเซลล์หนึ่งในวงจรของเซลล์ที่ link กัน เช่น เซลล์ A1 มีสูตร =A3 และเซลล์ A2 มีสูตร =A1 แล้วเซลล์ A3 มีสูตร =A2 ย่อมทำให้เกิด ตำแหน่งอ้างอิงแบบวงกลมได้เช่นกัน ซึ่งเรียกอีกแบบหนึ่งว่าเกิดการคำนวณแบบวงกลม (Circular Calculation)

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

  • ในเงื่อนไขการคำนวณต้นทุนสินค้า ซึ่งนำค่าใช้จ่ายทั้งทางตรงและทางอ้อมมา allocate เป็นต้นทุนของสินค้า จากนั้นหากสินค้านั้นกลับไปใช้เป็นวัตถุดิบให้กับสินค้าอื่น แล้วสุดท้ายก็นำสินค้าอื่นนั้นมาใช้เป็นองค์ประกอบร่วมกับสินค้าเดิมอีก
  • หากบริษัทรับจ่ายภาษีเงินได้บุคคลธรรมดาแทนพนักงาน ซึ่งตามกฎเกณฑ์ทางภาษีอากรกำหนดให้นำภาษีที่จ่ายแทนนั้นนำมาบวกเป็นเงินได้เพิ่ม แล้วเงินได้รวมที่เพิ่มขึ้นนี้ก็ต้องนำกลับไปย้อนคิดภาษีเงินได้อีก
  • ค่าใช้จ่ายบางรายการ อาจมีข้อกำหนดทางภาษีว่าห้ามนำมาหักภาษีซ้ำอีก แต่ค่าใช้จ่ายนั้นกลับมีฐานการคำนวณที่เกิดขึ้นจากกำไรสุทธิ
  • ในกรณีของการกู้เงิน ถ้าบริษัทนำดอกเบี้ยจ่ายเงินกู้ไปเพิ่มยอดเงินที่ต้องกู้เพิ่ม ย่อมทำให้ต้องจ่ายดอกเบี้ยเพิ่มและทำให้ต้องกู้เพิ่ม
  • การของบประมาณค่าใช้จ่ายที่กำหนดว่าจะให้ตามอัตราร้อยละของกำไร ซึ่งถ้ากำไรเพิ่มก็จะทำให้ได้งบประมาณค่าใช้จ่ายเพิ่ม แต่ค่าใช้จ่ายที่เพิ่มขึ้น ย่อมส่งผลให้กำไรลด และทำให้ได้งบประมาณค่าใช้จ่ายลดลงตาม ซึ่งกลับทำให้กำไรเพิ่มขึ้น
  • งานคำนวณอื่นๆ เช่น การควบคุมให้ Excel เพิ่มค่าตัวเลขครั้งละเท่าๆกัน โดยสร้างสูตร =Number+A1 ลงไปในเซลล์ A1 หรือการบันทึกประวัติตัวเลขสูงสุด โดยสร้างสูตร =Max(A1,NumberRange) ลงไปในเซลล์ A1

หมายเหตุ แทนที่จะใช้สูตรที่มีตำแหน่งอ้างอิงแบบวงกลม ซึ่งทำให้แฟ้มนั้นมีระบบการคำนวณแบบพิเศษที่ต้องสั่งให้ Excel ยอมรับก่อนจึงจะคำนวณได้คำตอบถูกต้อง เราสามารถใช้คำสั่งอื่นที่ทำหน้าที่สั่งให้ Excel คำนวณซ้ำได้ เช่น Goal Seek หรือใช้ Solver Add-in หรือใช้คำสั่งจาก Visual Basic ควบคุมการคำนวณแทน


ขั้นตอนการสร้างสูตรคำนวณแบบ Circular Reference

  1. ให้เลือกสร้างสูตรอื่นๆที่คำนวณตามปกติทุกสูตร (ที่ไม่ต้องใช้การคำนวณแบบ Circular Reference) ให้เสร็จก่อน แล้วจึงสร้างสูตรที่ต้องคำนวณแบบ Circular Reference เป็นสูตรสุดท้าย เนื่องจากหากต้องการให้ Excel คำนวณแบบ Circular เมื่อใด คุณจะต้องสั่งให้ Excel เลิกเปิดคำเตือน ซึ่งหากมีการสร้างสูตรผิดพลาดเผลอไปสร้างสูตร Circular Reference ขึ้นโดยไม่เจตนา ก็ย่อมไม่มีการเตือนให้ทราบ
  2. เมื่อสร้างสูตรคำนวณแบบ Circular Reference แล้วกดปุ่ม Cancel เพื่อปิดคำเตือนบนหน้าจอตามรูปข้างต้นแล้ว จะพบคำว่า Circular References: ต่อด้วยตำแหน่งเซลล์แสดงขึ้นตรงขอบด้านล่างซ้ายของจอ พร้อมทั้งในพื้นที่ตารางก็จะมีเส้นลูกศรสีน้ำเงินชี้ตำแหน่งเซลล์ที่ทำให้เกิดการอ้างอิงแบบวงกลม ซึ่งหากต้องการให้ Excel แสดงชื่อตำแหน่งเซลล์ที่เกี่ยวข้องกับการอ้างอิงแบบวงกลมด้วย ให้สั่ง Formulas > Error Checking > Circular References แล้วจะพบตำแหน่งเซลล์ที่เกี่ยวข้องปรากฏต่อท้ายคำสั่งนี้

    image100

  3. เมื่อต้องการให้ Excel ยอมรับการคำนวณแบบ Circular Reference ให้สั่ง File > Excel Options > Formulas > กาช่อง Enable iterative calculation (Excel 2003 สั่ง Tools > Options > Calculation > กาช่อง Iteration)

    image102

  4. ช่อง Maximum Iterations และช่อง Maximum Change นั้นไม่จำเป็นต้องเข้าไปแก้ไขตัวเลขใดๆ ซึ่ง 2 ช่องนี้ทำหน้าที่สั่งให้ Excel คำนวณสูงสุดถึง 100 ครั้ง หรืออาจไม่ถึง 100 ครั้งก็ได้โดยให้คำนวณจนกว่าจะพบว่า คำตอบที่คำนวณได้ในแต่ละรอบให้ค่าแตกต่างกันน้อยกว่า .001 ก็จะหยุดคำนวณ ซึ่งการคำนวณเป็นรอบดังกล่าวนี้จะเกิดขึ้นทันทีที่มีการสร้างสูตรนั้นเสร็จแล้วกดปุ่ม Enter รับสูตรลงไปหรือเมื่อมีการกดปุ่ม F9 เพื่อสั่งให้ Excel คำนวณ
    • ให้เพิ่มตัวเลขจำนวนรอบสูงสุดในช่อง Maximum Iterations เมื่อพบว่าทุกครั้งที่กดปุ่ม F9 เพื่อสั่งคำนวณ จะได้ตัวเลขคำตอบต่างจากเดิมไปเสมอ ซึ่งหากเพิ่มตัวเลขในช่องนี้แล้วกดปุ่ม F9 พบว่าตัวเลขผลจากการคำนวณไม่เปลี่ยนแปลงต่อไปอีก ย่อมแสดงว่าได้คำตอบสุดท้ายแล้ว
    • ให้ปรับตัวเลขค่าความละเอียดในช่อง Maximum Change ต่อเมื่อต้องการให้ Excel คำนวณละเอียดขึ้น ซึ่งย่อมทำให้ต้องใช้จำนวนครั้งในช่อง Maximum Iterations เพิ่มขึ้นตามไปด้วย
  5. หลังจากสั่งคำสั่งตามข้อ 3 แล้ว จะไม่พบข้อความหรือตำแหน่งเซลล์ที่แสดงบนหน้าจอตามตำแหน่งต่างๆที่เคยแสดงไว้ตามข้อ 2 อีกต่อไป แต่จะพบคำว่า Calculate แสดงค้างอยู่ตรงขอบจอด้านล่างซ้ายของโปรแกรม Excel แทน และขอให้สังเกตว่าทุกครั้งที่กดปุ่ม F9 จะทำให้คำว่า Calculate นี้หายไปชั่วขณะหนึ่งแล้วกลับมาแสดงใหม่ (โดยไม่เกี่ยวข้องกับการสั่งให้คำนวณแบบ Manual ที่จะมีคำว่า Calculate แสดงขึ้นมาเช่นกัน แต่เมื่อกดปุ่ม F9 เพื่อสั่งคำนวณแบบ Manual จะทำให้คำว่า Calculate หายไปโดยไม่กลับมาใหม่อีก)

    image104

  6. ในกรณีที่ต้องการตรวจสอบที่ไปที่มาของสูตรที่มีการใช้ตำแหน่งอ้างอิงแบบวงกลมว่ามีเซลล์ใดที่เกี่ยวข้องบ้าง ให้ย้อนกลับไปตัดกาช่อง Enable iterative calculation ทิ้งไป จากนั้น Excel จะแสดงตำแหน่งเซลล์ที่เกี่ยวข้องไว้ที่คำสั่ง Formulas > Error Checking > Circular References ซึ่งเซลล์เหล่านั้นอาจจะเป็นเซลล์สูตรที่สร้างไว้อย่างตั้งใจหรือเผลอแก้ไขสูตรให้ต่างจากเดิมไปจนทำให้เกิด Circular reference ขึ้นก็ได้ จากนั้นให้ทยอยลบสูตรในเซลล์ดังกล่าวทิ้งไปทีละเซลล์ จนกว่าจะพบว่าเมื่อลบสูตรในเซลล์ใดเสร็จแล้ว ทำให้ไม่เกิดคำเตือน Circular ต่อไปอีก หลังจากนั้นจึงไล่สร้างสูตรใหม่ขึ้นมาแทน ซึ่งหลายๆครั้งจะพบว่าต้องไล่ลบสูตรในเซลล์ทิ้งแล้วต้องสร้างสูตรใหม่นับร้อยนับพันเซลล์ทีเดียว โดยเฉพาะตารางคำนวณที่ต้องคำนวณรายการรายวันหรือรายเดือนต่อกันไปเป็นตารางขนาดใหญ่ ดังนั้นผู้ใช้ Excel ทุกคนต้องรู้ตัวทันทีเมื่อตัวเองเผลอสร้างสูตรที่มีตำแหน่งอ้างอิงแบบวงกลมขึ้นมาเป็นครั้งแรก หากปล่อยไว้ก็จะต้องเสียแรงเสียเวลาไล่ย้อนมาแก้ไขกันใหม่ทีละเซลล์
  7. เซลล์ที่ทำให้เกิด Circular นี้ ควรใส่สีให้ต่างจากเซลล์อื่น หรือทำเครื่องหมายพิเศษ หรือเขียนอธิบายกำกับไว้ด้วยเพื่อเตือนผู้ใช้งานให้แก้ไขสูตรอย่างระมัดระวัง
  8. ควรตั้งชื่อแฟ้มที่มีสูตรที่มีตำแหน่งอ้างอิงแบบวงกลมให้มีชื่อที่สะดุดตา จะได้ไม่เผลอเปิดแฟ้มที่ต้องคำนวณแบบ Iterations นี้ขึ้นมาใช้งานพร้อมกับแฟ้มอื่น เพราะแฟ้มอื่นๆจะรับคำสั่ง Iterations นี้ตามไปด้วยโดยไม่จำเป็น
  9. หากปิดโปรแกรม Excel แล้วเปิด Excel ขึ้นมาใหม่ จะพบว่า Excel ตัดกาช่อง Enable iterative calculation ทิ้งไปให้เสมอ

พึงคิดเผื่ออนาคตไว้เสมอว่า ตารางที่ออกแบบไว้ต้องสามารถรองรับกับการปรับเปลี่ยนเพิ่มเติมประเภทของข้อมูลที่บันทึก เช่น เดิมเคยฝากถอนเงินกับธนาคารเพียง 3 แห่ง ถ้าต้องการบันทึกธุรกรรมกับธนาคารเพิ่มเติมอีกหลายแห่ง ต้องสามารถใช้ตารางเดิมบันทึกได้ในทันทีโดยไม่ต้องเปลี่ยนหรือแก้ไขโครงสร้างตารางหรือแก้ไขสูตร

  1. แยกตารางเก็บข้อมูลออกจากตารางคำนวณหรือตารางรายงาน โดยในตารางเก็บข้อมูลนี้เป็นข้อมูลที่เกิดจากการพิมพ์บันทึกลงไปเท่านั้น ไม่มีสูตรคำนวณใดๆทั้งสิ้น ห้าม Merge เซลล์ และไม่จำเป็นต้องกำหนด Format หรือเปลี่ยน Format ให้ต่างไปจากเดิม
  2. ใช้ตารางบันทึกข้อมูลไว้ในชีทเดียวแฟ้มเดียว โดยบันทึกรายการเพิ่มตามแนวนอนหรือเพิ่ม row (ห้ามเพิ่ม column ข้อมูลใหม่ตามแนวตั้ง) เพื่อบันทึกรายการใหม่ต่อท้ายรายการเดิมที่มีอยู่แล้วไปเรื่อยๆ

    image003

  3. แทนที่จะเพิ่ม column เพื่อใช้เก็บข้อมูลเรื่องนั้นๆโดยเฉพาะ ซึ่งย่อมทำให้มี column จำนวนมาก ขอให้ใช้ column เพื่อระบุชื่อรายการกำกับรายการนั้นๆแทน จะทำให้ประหยัดจำนวน column ลงไปได้มาก และไม่มีเซลล์ที่เว้นช่องว่างไว้โดยไม่เกิดประโยชน์

    image004

  4. ตารางเก็บข้อมูลมีจุดประสงค์หนึ่งเพื่อใช้อ้างอิงข้อมูลเก่าๆหรือบันทึกตามลำดับเหตุการณ์ที่เกิดขึ้นก่อนหลัง ดังนั้นจึงห้ามแทรกรายการใหม่เข้าไประหว่างรายการเก่า หรือเมื่อเวลาผ่านไปแล้ว ห้ามย้อนไปแก้ไขข้อมูลเก่า หรือลบรายการใดๆที่บันทึกไว้อันอาจทำให้ไม่สามารถใช้อ้างอิงเพื่อทราบถึงประวัติของข้อมูล (เฉพาะเมื่อพบว่าข้อมูลที่บันทึกไว้ผิดพลาด จึงเป็นความจำเป็นต้องแก้ไขข้อมูลเก่า และก่อนที่จะแก้ไข ต้องจัดเก็บข้อมูลเก่าไว้เป็นหลักฐานด้วยเสมอโดยจัดเก็บแยกเป็นแฟ้มต่างหากหรือพิมพ์ลงกระดาษเพื่อใช้เป็นหลักฐานในการแก้ไข)
  5. ข้อมูลที่บันทึกในตารางหนึ่งๆ ต้องเป็นข้อมูลที่มีความสัมพันธ์หรือเกี่ยวข้องเป็นเรื่องเดียวกัน โดยแยกตารางข้อมูลเรื่องอื่นให้เป็นอีกตารางหนึ่ง เช่น ตารางการฝากถอนเงินธนาคารก็ต้องมีข้อมูลที่เกี่ยวข้องกับการฝากถอนเท่านั้น ไม่ควรนำข้อมูลเกี่ยวข้องกับการรับจ่ายเงินกับลูกค้าหรือเจ้าหนี้มาไว้กับตารางฝากถอนเงินธนาคาร เว้นแต่การฝากถอนนั้นทำไปเพื่อรับจ่ายเงินกับลูกค้าหรือเจ้าหนี้ในกำหนดเวลาเดียวกัน เป็นเหตุเป็นผลทำให้สามารถนำข้อมูลมาบันทึกไว้ในตารางเดียวกัน
  6. ในแต่ละตารางที่แยกกัน แม้เป็นตารางต่างเรื่องกันที่แยกไว้ในชีทหรือแฟ้มต่างกันก็ตาม เช่น ตารางลูกค้า ตารางสินค้า หรือตารางการขายประจำวัน ควรกำหนดให้ใช้ column ที่ตรงกันเก็บข้อมูลเรื่องเดียวกัน เช่น กำหนดให้ column แรกซ้ายสุดหรือ column ในลำดับที่ตรงกันของแต่ละตาราง บันทึกข้อมูลเกี่ยวกับวันที่ เลขรหัส หรือข้อมูลเรื่องเดียวกันให้ตรงกันทุกตาราง
  7. ข้อมูลที่จัดเก็บในตารางบันทึกข้อมูล ต้องแยกรายละเอียดให้สามารถใช้ในการค้นหาหรือคำนวณหายอดที่ต้องการได้ทันที เช่น ข้อมูลเกี่ยวกับชื่อนามสกุล ควรแยกข้อมูลให้มี column เฉพาะสำหรับบันทึกคำนำหน้าชื่อ แยกออกจาก column บันทึกชื่อและ column บันทึกนามสกุล เพื่อทำให้ยืดหยุ่นในการค้นหาข้อมูลเฉพาะชื่อ หรือเฉพาะนามสกุลได้ทันทีในอนาคต
  8. โครงสร้างตารางฐานข้อมูลที่ดี ต้องออกแบบตามกฎ 3 ข้อ ดังนี้
    • หัวตาราง (Field Name) ซึ่งเป็นบรรทัดบนสุดของตาราง และรายการแต่ละรายการที่เป็นเรื่องเดียวกัน ต้องใช้ row เดียวเท่านั้น หากต้องการบันทึกหลายบรรทัด ให้ใช้วิธีกดปุ่ม Alt+Enter เพื่อพิมพ์ข้อความในบรรทัดใหม่ในเซลล์เดียวกัน

      จากภาพนี้ ตารางแบบที่ 4 เท่านั้นที่ใช้วิธีการบันทึกถูกต้อง

      Wrap VS Alt

    • ต้องมี column ใด column หนึ่งซึ่งบันทึกข้อมูลแต่ละรายการติดต่อกันไปตลอดทุกเซลล์ ห้ามเว้นเซลล์ว่าง โดยเฉพาะอย่างยิ่ง column ที่ใช้บันทึกชื่อหรือเลขรหัส เพื่อใช้กำกับแต่ละรายการว่าเป็นรายการอะไรและไม่ซ้ำกับรายการอื่น
    • ห้ามนำตารางฐานข้อมูลไปติดกับข้อมูลอื่นในเซลล์อื่นรอบข้าง ให้เว้นระยะไว้อย่างน้อย 1 เซลล์รอบข้าง เพื่อทำให้ Excel สามารถรู้ขอบเขตของตารางจากพื้นที่ข้อมูลที่ติดต่อกันไปได้เอง โดยเฉพาะชื่อตารางที่พิมพ์ไว้ด้านบนเหนือหัวตาราง ควรเว้นระยะห่างจากหัวตารางไว้ 1 row เช่นกัน
  9. ข้อมูลเกี่ยวข้องกับวันที่ ให้บันทึกไว้ใน column ใด column หนึ่งเพื่อกำกับข้อมูลทุกรายการ โดยบันทึกในโครงสร้างของ วันที่/เดือน/ปีค.ศ.4 หลัก เช่น 14/2/2011 เสมอ (ไม่ควรบันทึกแค่เลขวันที่หรือชื่อเดือน) เพื่อช่วยให้สามารถหายอดรวมแยกประเภทได้ตามวัน เดือน หรือปีที่ต้องการได้ด้วยสูตรหรือคำสั่งบนเมนูได้ทันที
  10. ข้อมูลเรื่องปริมาณ จำนวน เลขรหัส ต้องบันทึกแบบตัวเลขเท่านั้น เช่น จำนวนสินค้า 20 กก ให้บันทึกเฉพาะตัวเลข 20 ลงไปในเซลล์เท่านั้น ถ้ารหัสเป็นตัวเลขและมีเลขศูนย์นำหน้า เช่น 00123 ให้บันทึกเฉพาะเลข 123 แล้วกำหนดรูปแบบตัวเลขเป็น 00000 (อย่าพิมพ์ ‘00123 เพราะ Excel จะรับรู้ว่าเป็นตัวอักษรแทน) หรือกำหนดให้ใช้เลขรหัสที่ Excel รับรู้ว่าเป็นตัวอักษรโดยใช้ตัวอักษรนำหน้าเลขศูนย์ เช่น a00123
  11. ในกรณีที่มีข้อมูลซ้ำกันหลายรายการซึ่งโดยทั่วไปสูตร VLookup ใน Excel จะสามารถค้นหาเฉพาะรายการแรกเท่านั้น ให้แก้ไขโดยสร้าง column ใหม่เพื่อปรับรหัสเดิมที่ซ้ำกันให้เป็นรหัสใหม่ที่ไม่ซ้ำโดยนำเลขลำดับที่ของรายการไปต่อท้ายรหัสเดิม ซึ่งแม้ว่าจะทำให้แฟ้มมีขนาดใหญ่ขึ้น แต่จะช่วยให้สามารถใช้สูตร VLookup ได้ง่ายและใช้เวลาคำนวณเร็วกว่าที่จะใช้สูตรยากๆยาวๆเพื่อหาค่าซ้ำ

    image005

  12. แม้เซลล์ใดที่ยังไม่ทราบตัวเลขข้อมูล ขอให้บันทึกเลข 0 แทนไว้ก่อน ห้ามปล่อยเซลล์ตัวเลขใดๆเว้นไว้เป็นเซลล์ว่าง เพราะถ้าเป็นเซลล์ว่างจะทำให้ Pivot Table นำข้อมูลเรื่องนั้นไปสรุปแบบ Count แทนที่จะเป็น Sum

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

คำสั่งบนเมนูซึ่งสามารถนำมาค้นหาข้อมูลที่กระจายกัน ได้แก่ การใช้คำสั่ง Find (Ctrl+f) เพื่อหาข้อมูลที่ทราบว่าสะกดอย่างไร ถ้าทราบแต่เพียงลักษณะของข้อมูลว่าเป็นตัวเลขหรือตัวอักษร ให้ใช้คำสั่ง Goto Special (F5 > Special) จากคำสั่ง Home > Find & Select

สูตรที่ใช้ค้นหาข้อมูลที่กระจายกันในเซลล์ที่ทราบตำแหน่งชัดเจน ได้แก่ IF และ Choose

สูตร IF

เป็นสูตรที่ยืดหยุ่นที่สุด แต่สามารถนำมาใช้กับกรณีที่มีเงื่อนไขไม่มากนัก โดยเงื่อนไขที่ใช้ในสูตร IF สามารถใช้เงื่อนไขได้ทุกประเภทในการเปรียบเทียบตั้งแต่ =, >, <, >=, <= หรือ <> และไม่จำกัดว่าต้องเปรียบเทียบกับค่าที่เป็นตัวเลขหรือตัวอักษร และไม่จำกัดว่าตัวเลขตัวอักษรนั้นมีค่าเป็นเท่าใด เช่น

=IF(   YourChoice="A",   L6,   L17   )

ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับตัวอักษร A ให้นำค่ามาจากเซลล์ L6 มาแสดง แต่ถ้า YourChoice มีค่าไม่เท่ากับตัวอักษร A ให้นำค่าจากเซลล์ L17 มาแสดงแทน

=IF(   YourChoice>=123,   L6,   L17   )

ถ้าเซลล์ชื่อ YourChoice มีค่ามากกว่าหรือเท่ากับตัวเลข 123 ให้นำค่ามาจากเซลล์ L6 มาแสดง แต่ถ้า YourChoice มีค่าไม่มากกว่าหรือเท่ากับตัวเลข 123 ให้นำค่าจากเซลล์ L17 มาแสดงแทน


 

สูตร Choose

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

=CHOOSE(  YourChoice,   L6,   L17,   M17,   K17,   O77   )

ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับเลข 1 ให้นำค่าจากเซลล์ L6 มาแสดง
ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับเลข 2 ให้นำค่าจากเซลล์ L17 มาแสดง
ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับเลข 3 ให้นำค่าจากเซลล์ M17 มาแสดง
ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับเลข 4 ให้นำค่าจากเซลล์ K17 มาแสดง
ถ้าเซลล์ชื่อ YourChoice มีค่าเท่ากับเลข 5 ให้นำค่าจากเซลล์ O77 มาแสดง

=CHOOSE(  TypeInput,  Price1,   Price2,   Price3,    Price4)

ถ้าเซลล์ชื่อ TypeInput มีค่าเท่ากับเลข 1 ให้นำค่าจากเซลล์ที่มีชื่อว่า Price1 มาแสดง
ถ้าเซลล์ชื่อ TypeInput มีค่าเท่ากับเลข 2 ให้นำค่าจากเซลล์ที่มีชื่อว่า Price2 มาแสดง
ถ้าเซลล์ชื่อ TypeInput มีค่าเท่ากับเลข 3 ให้นำค่าจากเซลล์ที่มีชื่อว่า Price3 มาแสดง
ถ้าเซลล์ชื่อ TypeInput มีค่าเท่ากับเลข 4 ให้นำค่าจากเซลล์ที่มีชื่อว่า Price4 มาแสดง

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

หมายเหตุ

ใน Excel 2003 ในวงเล็บของสูตรใดๆจะนำสูตรมาใส่ซ้อนเข้าไปได้เพียง 7 สูตร ดังนั้นสูตร IF จึงซ้อนกันได้อีก 7 IF ภายในวงเล็บของสูตร และ Choose จำกัดเงื่อนไขที่เป็นตัวเลขตั้งแต่เลข 1 – 29 เท่านั้น

ส่วน Excel 2007 เป็นต้นมา ในวงเล็บจะซ้อนสูตรได้ถึง 64 สูตร และสูตร Choose สามารถรับเงื่อนไขเป็นตัวเลขตั้งแต่ 1 – 254 ซึ่งแม้จะทำให้สามารถใช้สูตร IF และ Choose ในการค้นหาข้อมูลที่กระจายตัวกันได้สะดวกกว่าเดิมก็ตาม แต่ย่อมทำให้สูตรซับซ้อนต่อการแกะและทำความเข้าใจได้ยากขึ้นเช่นกัน

“ทำอะไรอยู่หรือ” ผมถามแฟนที่กำลังคร่ำเครียดอยู่หน้าจอคอมพิวเตอร์

“กำลังพิมพ์สลิปจ่ายเงินเดือนอยู่” เธอกำลังลอกข้อมูลจากตาราง Excel มาแปะลงไปในโปรแกรม Word แล้วพิมพ์ออกไปทีละใบ

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

งานลักษณะเดียวกันนี้เป็นงานที่ต้องใช้เป็นประจำ นอกจากใช้พิมพ์สลิปเงินเดือนที่ต้องทำทุกเดือน ยังมีงานพิมพ์ใบ Invoice ใบสั่งซื้อ ใบเสร็จรับเงิน ใบหักภาษี ณ ที่จ่าย ซึ่งต้องทำเป็นประจำทุกวัน ถ้าแต่ละวันต้องพิมพ์นับร้อยนับพันรายการ คนที่รับผิดชอบงานแบบนี้รับรองว่าต้องเครียดจัด และรู้สึกว่าเป็นงานที่น่าเบื่อมาก

VBA ย่อมาจากคำว่า Visual Basic for Applications ซึ่งก่อนจะนำ VBA มาประยุกต์ใช้ ต้องแบ่งขั้นตอนการทำงานระหว่างคนกับ Excel กับ VBA ให้ได้ชัดเจนเสียก่อน ขั้นตอนใดบ้างที่ปล่อยให้เป็นหน้าที่ของคน ขั้นตอนใดบ้างที่เป็นหน้าที่ของ Excel และขั้นตอนใดที่จะปล่อยให้ใช้ VBA ช่วยเพื่อทำให้คอมพิวเตอร์ทำงานเองแบบอัตโนมัติ อย่าเหมารวมเอาทุกขั้นตอนมาเป็นหน้าที่ของ VBA โดยขอให้ยึดหลักต่อไปนี้

เรื่องอะไรที่ยากควรปล่อยไว้ในส่วนของ Excel แล้วปล่อยเรื่องง่ายไว้ในส่วนของ VBA

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

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

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

PrintLoop

 

ขั้นตอนส่วนที่ปล่อยให้เป็นหน้าที่ของคน

  1. สร้างตารางฐานข้อมูล B4:E9 และกรอกข้อมูลแต่ละรายการลงไปในตาราง
  2. สร้างแบบพิมพ์ M4:Q18 ตามแบบที่กำหนด
  3. กำหนดขอบเขต Print Area M4:Q18 และ Print Setup อื่น เช่น ข้อความบนหัวกระดาษและท้ายกระดาษ
  4. ลอกรหัส VBA Sub myPrintLoop ตามภาพไปใส่ไว้ใน Module ของแฟ้มงาน แล้วสร้างปุ่ม Print โดย Assign Macro ตามรหัส VBA Sub myPrintLoop
  5. เมื่อต้องการสั่งพิมพ์แบบ Manual ให้คลิกที่ช่องแสดงรหัสซึ่งอยู่เหนือปุ่ม Print เพื่อเลือกรหัสลูกค้าที่ต้องการพิมพ์ หรือจะใช้วิธีพิมพ์เลขที่รายการลงไปในเซลล์ G4 ซึ่งตั้งชื่อ Range Name ว่า Choice แทนก็ได้
  6. ถ้าต้องการสั่งพิมพ์อัตโนมัติให้คลิกที่ปุ่ม Print

ขั้นตอนส่วนที่เป็นหน้าที่ของ Excel ซึ่งใช้สูตรตามที่คนสร้างไว้

  1. ใช้สูตร Index ดึงข้อมูลตามเลขที่รายการในเซลล์ Choice มาแสดงไว้ในแบบฟอร์ม เช่น เซลล์ O7 มีสูตร =INDEX(C5:C9,Choice) เพื่อดึงชื่อลูกค้าจากพื้นที่ C5:C9 ในลำดับที่ตามเลขในเซลล์ Choice
  2. ใช้สูตร =COUNTA(B5:B9) เพื่อนับจำนวนรายการทั้งหมดมาแสดงไว้ในเซลล์ G7 ซึ่งตั้งชื่อ Range Name ว่า Total

ขั้นตอนส่วนที่เป็นหน้าที่ของ VBA

Sub myPrintLoop()
    MyVar = [choice]
    myStart = InputBox("From#", , 1)
    myStop = InputBox("To#", , [Total])
    For i = myStart To myStop
        [choice] = i
        ActiveWindow.SelectedSheets.PrintPreview
    Next i
    [choice] = MyVar
End Sub

  1. Sub myPrintLoop()
    เป็นชื่อของชุดคำสั่ง
  2. MyVar = [choice]
    เพื่อเก็บเลขที่รายการเริ่มแรกตามที่เคยกรอกไว้ในเซลล์ชื่อ Choice ไปเก็บไว้ในตัวแปรชื่อ MyVar ช่วยทำให้หลังจากพิมพ์ครบทุกรายการแล้วจะนำตัวเลขรายการเดิมกลับไปแสดงไว้ตามเดิม
  3. myStart = InputBox("From#", , 1)
    เพื่อเปิดหน้าจอให้กรอกเลขที่รายการแรกสุดที่ต้องการพิมพ์ โดยระบบจะกรอกเลข 1 ให้เป็นค่าเริ่มแรกไว้ให้ก่อน แล้วจะนำตัวเลขรายการนี้ไปเก็บไว้ในตัวแปรชื่อ myStart
    PrintLoopFrom
  4. myStop = InputBox("To#", , [Total])
    เพื่อเปิดหน้าจอให้กรอกเลขที่รายการสุดท้ายที่ต้องการพิมพ์ โดยระบบจะนำเลขตามจำนวนรายการที่นับได้ในเซลล์ Total ให้เป็นค่าเริ่มแรกไว้ให้ก่อน แล้วจะนำตัวเลขรายการนี้ไปเก็บไว้ในตัวแปรชื่อ myStop
    PrintLoopTo
  5. For i = myStart To myStop
    เริ่มต้นคำสั่งให้ทำงานซ้ำ โดยใช้ตัวเลขจากตัวแปรชื่อ myStart ไปวนซ้ำทีละครั้งแล้วเพิ่มเลขทีละ 1 ไปจนจบตามตัวเลขจากตัวแปรชื่อ myStop ซึ่งทุกรอบที่ทำงานจะส่งตัวเลขไปเก็บไว้ในตัวแปรชื่อ i
  6. [choice] = i
    เป็นขั้นตอนสำคัญที่สุดเพื่อส่งตัวเลข i แต่ละรอบไปที่เซลล์ที่ตั้งชื่อว่า choice ซึ่งสูตร Index ก็จะดึงข้อมูลตามเลขที่รายการในแต่ละรอบไปแสดงไว้ในแบบฟอร์ม
  7. ActiveWindow.SelectedSheets.PrintPreview
    ตัวอย่างนี้ใช้คำสั่ง PrintPreview เพื่อแสดงภาพบนหน้าจอให้เห็นตามหน้าแบบฟอร์มที่จะพิมพ์ออกไป ซึ่งในการใช้งานจริงให้เปลี่ยนเป็นคำสั่งนี้แทน ActiveWindow.SelectedSheets.PrintOut
  8. Next i
    เพื่อสั่งให้วนรอบต่อไป
  9. [choice] = MyVar
    เพื่อปรับข้อมูลให้กลับสู่เลขที่รายการเดิมก่อนที่จะสั่งพิมพ์
  10. End Sub
    จบชุดคำสั่ง

Download ตัวอย่างได้จาก
https://drive.google.com/open?id=1uZft748D9CS-9v7QSqWN9Kj41Rz7JLVJ

 

การรับรองประสิทธิผลของการควบคุมภายในเกี่ยวกับรายงายทางการเงินตาม Section 404 of Sarbanes - Oxley Act เขียนโดย..คุณสมชาติ กาลสุข  และ ผศ.ดร.ศิลปพร ศรีจั่นเพชร
http://www.jap.tbs.tu.ac.th/files/Article/Jap08/Full/JAP08Sinlapaporn.pdf

Are you managing your spreadsheet risk?
http://www.cimaglobal.com/Thought-leadership/Newsletters/Insight-e-magazine/Insight-Archive/Are-you-managing-your-spreadsheet-risk/

Auditing Spreadsheets: Concerns & Comments
http://www.isaca.org/chapters2/Pittsburgh/events/Documents/2013/January%20Luncheon%20-%20Auditing%20Spreadsheets/AuditingSpreadsheets-dhs.pdf

Best Practice Modeling – Make these 5 changes today
http://chandoo.org/wp/2012/08/29/best-practice-modeling-5tips/

Damn 88% of spreadsheets have errors
http://www.marketwatch.com/story/88-of-spreadsheets-have-errors-2013-04-17

Enterprise Spreadsheet Management – A Necessary Good
http://www.clusterseven.com/storage/whitepapers/Enterprise%20Spreadsheet%20Management%20A%20Necessary%20Good.pdf

Errors in Building and Using Electronic Tables:
Financial Consequences and Minimisation Techiques
http://www.ef.uns.ac.rs/sm/archive/SM2012_3.pdf#page=31

Excel Competency for the Professional Accountant: Advanced Applications, Controls, and Audit Addins
http://www.aisej.com/doi/pdfplus/10.3194/1935-8156-5.1.25

Excel! How the 'most important software application of all time' is ruining the world
http://fortune.com/2013/04/17/damn-excel-how-the-most-important-software-application-of-all-time-is-ruining-the-world/

Five Common Spreadsheet Risks and Ways to Control Them
https://iaonline.theiia.org/five-common-spreadsheet-risks-and-ways-to-control-them

Good Practice Guidelines for Spreadsheet Design
http://www.lse.ac.uk/intranet/LSEServices/IMT/guides/softwareGuides/office2003/Excel-2003-Spreadsheet-Design-Good-Practice-Guidelines.pdf

How do you know your spreadsheet is right?
http://www.eusprig.org/hdykysir.pdf

Improving Spreadsheet Audits in Six Steps
https://www.deloitte.com/assets/Dcom-UnitedStates/Local%20Assets/Documents/ us_risk%20consulting_IT%20Audit_ImprovingSpreadsheets.pdf

Introduction to spreadsheet risk management
http://chandoo.org/wp/2011/12/07/spreadsheet-risk-management-introduction/

Key Aspects of Spreadsheet Controls
http://www.detroitiia.org/PDF/Key_Aspects_of_Spreadsheet_Controls_IIA.pdf

Managing Spreadsheets
http://www.actuate.com/download/analyst-papers/bloor-managing-spreadsheets-paper.pdf

Managing Spreadsheets: Reducing Risk and Gaining Confidence
http://new.incisive.com/wp-content/uploads/downloads/whitepapers/ Incisive%20White%20Paper%20Spreadsheet%20Risk.pdf

Methodology for the Audit of Spreadsheet Models
http://customs.hmrc.gov.uk/channelsPortalWebApp/downloadFile?contentID=HMCE_PROD_009443

Microsoft's Excel Might Be The Most Dangerous Software On The Planet
http://www.forbes.com/sites/timworstall/2013/02/13/microsofts-excel-might-be-the-most-dangerous-software-on-the-planet/

Minimising Spreadsheet Errors
http://www.protiviti.com/en-UK/Documents/ICAEW-Minimising-Spreadsheet-Errors.pdf

Move from Excel to accounting software
https://www.xero.com/small-business-guides/accounting/move-from-excel/

New guidelines for spreadsheets
http://arxiv.org/ftp/arxiv/papers/0807/0807.3186.pdf

New server release: Spreadsheet controls in Office 2013
http://blogs.office.com/2013/05/14/new-server-release-spreadsheet-controls-in-office-2013/

Office Audit and Control Management Server 2013 releases to Open License tomorrow
http://blogs.technet.com/b/uspartner_ts2team/archive/2013/05/31/office-audit-and-control-management-server-2013-releases-to-open-license-tomorrow.aspx=

Sarbanes-Oxley: What About all the Spreadsheets?
Controlling for Errors and Fraud in Financial Reporting
http://arxiv.org/ftp/arxiv/papers/0804/0804.0797.pdf

Spreadsheet Issues: Pitfalls, Best Practices, and Practical Tips
http://www.soa.org/library/journals/actuarial-practice-forum/2010/february/apf-2010-02-campbell.pdf

Spreadsheet Management: Not What You Figured
http://www.deloitte.com/assets/Dcom-UnitedStates/Local%20Assets/Documents/ AERS/us_risk_spreadsheet_mgt_022509%20(2).pdf

Spreadsheet Management by KPMG
http://www.kpmg.com/US/en/services/Advisory/risk-and-compliance/financial-risk-management/Documents/spreadsheet-management-slipsheet.pdf

Spreadsheet Management with the New Office
http://go.microsoft.com/fwlink/p/?LinkId=280264

Spreadsheet Risk Management: Frequently Asked Questions
http://www.protiviti.com/en-US/Documents/Resource-Guides /SpreadsheetRiskMgmtFAQ09.pdf

Spreadsheet Risk, Awareness, and Control
mba.tuck.dartmouth.edu/spreadsheet/product_pubs_files/SSrisk.doc

The Importance and Criticality of Spreadsheets in the City of London
http://www.eusprig.org/tiacositcol4.pdf

The Seven Deadly Spreadsheet Sins
http://production-scheduling.com/seven-deadly-spreadsheet-sins/

Twenty principles for good spreadsheet practice
http://www.icaew.com/~/media/Files/Technical/information-technology/excel-community/166-twenty-principles-for-good-spreadsheet-practice.pdf

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

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

เทคโนโลยีในโลกยุคใหม่ช่วยอำนวยความสะดวกต่อการใช้ชีวิตได้ง่ายกว่าแต่ก่อนมาก ทุกวันนี้คอมพิวเตอร์มีขนาดเล็กลงเรื่อยๆ อีกไม่นานต้องมีคอมพิวเตอร์ขนาดเท่ากับโทรศัพท์มือถือหรือมีขนาดเล็กแค่นาฬิกาข้อมืออย่างแน่นอน ทุกคนสามารถนำติดตัวไปได้ทุกที่และไม่จำเป็นต้องเสียเวลาเดินทางไปที่ทำงานอีกต่อไป สามารถทำงานได้ทุกเวลาตลอด 24 ชั่วโมง ส่งผลทำให้การดำเนินธุรกิจมีการแข่งขันสูงขึ้น ใครก็ตามที่พร้อมจะออกผลิตภัณฑ์ใหม่และตอบสนองต่อความต้องการของลูกค้าได้ทันที ย่อมเอาชนะคู่แข่ง สามารถครองตลาดได้ในที่สุด

เพื่อสร้างความได้เปรียบในการแข่งขัน สามารถสนองตอบต่อการเปลี่ยนแปลงได้ทันที กว่าจะรอให้ฝ่าย IT สร้างโปรแกรมสำเร็จรูปออกมาก็ไม่ทันการ โปรแกรม Excel จึงเป็นกุญแจสำคัญในการนำมาใช้แทนตั้งแต่เก็บข้อมูลไปจนถึงวางแผนตัดสินใจ สามารถใช้ Excel ช่วยปรับเงื่อนไขทางการตลาดให้เหนือกว่าคู่แข่งอยู่เสมอ แต่ระบบงานที่มีอยู่ยังไม่เกื้อหนุนกับการใช้ Excel ยังคงใช้ระบบที่ล้าสมัยเพราะสร้างขึ้นมาเพื่อสนับสนุนและควบคุมภายในสำหรับการใช้โปรแกรมสำเร็จรูป บริษัทส่วนใหญ่ยังมีเพียงระบบควบคุมภายในและรักษาความปลอดภัยสำหรับการปฏิบัติงานของฝ่าย IT  หรือมีระบบที่ระบุกว้างๆไว้สำหรับการควบคุมการรายงานทางการเงิน

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

การปรับปรุงระบบการบริหาร

  1. ผู้บริหารระดับสูงและคณะผู้บริหารต้องให้ความสำคัญต่อการจัดการกับความเสี่ยงที่เกิดจากการใช้ Excel อย่างมีประสิทธิภาพ โดยฝึกอบรมพนักงานให้เห็นความสำคัญของการควบคุมความเสี่ยง และกำหนดบทลงโทษเมื่อมีการละเมิด
  2. ผู้บริหารระดับสูงต้องประเมินความเสี่ยงเพื่อกำหนดประเภทงานที่มีความเสี่ยงสูงและจัดระดับการควบคุมที่เหมาะสม
  3. บริษัทต้องวางนโยบายสำหรับงานที่มีความเสี่ยงสูงให้พนักงานทุกระดับทำตาม
  4. บริษัทต้องมีระบบการติดตามตรวจสอบว่าได้มีการทำตามนโยบายที่วางไว้
  5. ตามกฎ Sarbanes-Oxley กำหนดให้บริษัทต้องมีคณะตรวจสอบภายในที่เป็นอิสระจากผู้บริหารระดับสูงและพนักงานสามารถติดต่อกับคณะตรวจสอบได้โดยตรง

การปรับปรุงระบบการทำงาน

  1. กำหนดขั้นตอนการสร้างและการตรวจสอบความถูกต้อง ให้มีการควบคุมที่รัดกุมมากน้อยตามความสำคัญหรือความเสี่ยงของการใช้ Excel
  2. จัดการป้องกันในระดับแฟ้มเพื่อให้พนักงานที่กำหนดมีสิทธิใช้แฟ้ม หรือหากใช้แฟ้มร่วมกันต้องป้องกันระดับชีทหรือเซลล์เพื่อให้พนักงานมีสิทธิแก้ไขได้เฉพาะเซลล์ที่กำหนดเท่านั้น
  3. แยกแยะหน้าที่ความรับผิดชอบให้ชัดเจนระหว่างผู้สร้างแฟ้ม ผู้ทดสอบ และผู้ใช้ และมุ่งป้องกันการสมรู้ร่วมคิดกันทุจริต
  4. แยกเครื่องคอมพิวเตอร์ที่ใช้สำหรับสร้างแฟ้ม ทดสอบ หรือใช้งานออกจากกัน และห้ามมิให้ผู้สร้างหรือผู้ทดสอบมีสิทธิ์มาใช้เครื่องที่มีไว้สำหรับใช้งาน
  5. ก่อนจะปล่อยแฟ้มให้ใช้งานกัน ต้องมีกระบวนการทดสอบว่าผ่านการควบคุมทั้งหมดข้างต้นครบถ้วนแล้ว
  6. หากใช้แฟ้มร่วมกัน ผู้ใช้ Excel ต้องมีความรับผิดชอบร่วมกัน ผลัดเปลี่ยนให้คนอื่นใช้แฟ้มบ้างเพื่อช่วยกันตรวจสอบและป้องกันทุจริต
  7. อบรมพนักงานให้ผู้ใช้ Excel มีความรู้พื้นฐานและมีความสามารถเพียงพอโดยเฉพาะการบันทึกข้อมูลให้ถูกต้อง มุ่งให้พนักงานช่วยกันสอดส่องอาการที่น่าสงสัยจากการคำนวณหรือการทุจริต

การปรับปรุงระบบสารสนเทศ

  1. แฟ้มที่มีลักษณะต่อไปนี้ควรพิจารณาเปลี่ยนไปใช้โปรแกรมสำเร็จรูปที่มีระบบการรักษาความปลอดภัยที่ดูแลและควบคุมโดยฝ่าย IT
    • แฟ้มบันทึกข้อมูลต้นทาง สำหรับนำไปใช้ต่อในการคำนวณหรือสร้างรายงาน
    • แฟ้มที่มีการใช้ VBA อย่างมาก
    • แฟ้มซึ่งเปิดให้ผู้ใช้หลายคนใช้งานร่วมกัน
    • แฟ้มที่ทำหน้าที่เชื่อมโยงข้อมูลระหว่างระบบ
    • แฟ้มซึ่งมีความซับซ้อน คำนวณช้า และกำลังพิจารณาสร้างใหม่
  2. สร้างระบบตรวจสอบควบคุมโดยฝ่าย IT หรือฝ่ายควบคุมภายใน โดยฝ่าย IT ต้องสร้างระบบที่เอื้อหนุนต่อการใช้ Excel เพื่อจำกัดการเข้าถึงแฟ้มเฉพาะบุคคลที่เกี่ยวข้อง และสามารถกู้แฟ้มกลับมาได้เมื่อมีปัญหา และฝ่ายควบคุมภายในคอยติดตามดูแลการใช้งานให้เป็นไปตามระบบ
    • Preventive and Access Control กำหนดสิทธิและขอบเขตหน้าที่ความรับผิดชอบของผู้ที่เข้าถึงแฟ้ม สร้างระบบที่สามารถติดตามประวัติการใช้แฟ้มของผู้ใช้งานแต่ละคน
    • Backups and Corrective Control ทำการสำรองข้อมูลเป็นประจำอย่างต่อเนื่อง และพิมพ์ข้อมูลมาเก็บไว้ สามารถนำข้อมูลที่ทำสำรองไว้มาใช้
    • Detective and Change Control ควบคุมการแก้ไขเปลี่ยนแปลงใดๆที่กระทำต่อตัวแฟ้ม จัดทำการทดสอบ และทำบันทึกการแก้ไข
    • Development Control ควบคุมการสร้างแฟ้มใหม่ให้ผ่านการทดสอบก่อนนำไปใช้
    • Version Control ควบคุมการใช้งานให้เป็นแฟ้มล่าสุดเสมอหรือเป็นแฟ้มรุ่นที่ถูกต้อง
  3. หากไม่มีระบบอัตโนมัติในการควบคุม ทุกครั้งที่มีการบันทึกข้อมูลเพิ่มเติม แก้ไขข้อมูลใหม่ หรือปรับปรุงใดๆที่เกิดขึ้นกับตัวแฟ้มที่มีความสำคัญ ให้พิมพ์รายการเหล่านั้นลงบนกระดาษและให้ผู้ที่เกี่ยวข้องลงนามกำกับแล้วนำเสนอให้ผู้บริหารรับทราบ

คำพังเพย “เรียนผูกก็ต้องเรียนแก้” เป็นคำเตือนที่ใช้กันมาตั้งแต่โบราณจวบจนปัจจุบันก็ยังไม่ล้าสมัย ยิ่งเทคโนโลยีมีความทันสมัยช่วยทำให้มนุษย์มีความสะดวกสบายมากขึ้น ยิ่งต้องนึกถึงคำพังเพยนี้ให้มากเพื่อใช้เทคโนโลยีอย่างระมัดระวัง แค่ใส่หูฟังกับดูมือถือไปขณะเดินข้ามถนนจะถูกรถชนได้ง่าย การใช้ Excel ก็เช่นกัน ต้องเรียนรู้วิธีใช้โปรแกรมในแนวทางที่ถูกต้องไว้ตั้งแต่แรกและสร้างงานโดยคิดหาทางป้องกันไว้ก่อนเพื่อไม่ให้เกิดผลเสียหายขึ้นในภายหลัง

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

สมัยก่อนในหลักสูตรบัญชีที่มหาวิทยาลัยธรรมศาสตร์ แม้ยุคนั้นยังไม่มี Excel หรือเครื่องคอมพิวเตอร์ส่วนตัวใช้ก็ตามแต่มีหลักสูตร Electronic Data Processing เป็นวิชาบังคับ ต้องเรียนภาษา Fortran และ COBOL ซึ่งต้องหัดเขียนภาพแผนภูมิแสดงลำดับการทำงานทีละคำสั่ง กลายเป็นพื้นฐานทำให้สามารถคิดใช้ Excel อย่างเป็นแบบแผน ต่างจากเด็กจบใหม่สมัยนี้ซึ่งใช้ Excel เป็นแต่คิดวางแผนการใช้งานอย่างเป็นขั้นเป็นตอนไม่เป็น

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

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

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

จุดขายของหลักสูตรอบรม Excel แทบทั้งหมดมักเน้นแต่เรื่องเด่นๆของ Excel เช่น PivotTable หรือ VBA ทำให้ผู้ที่ไม่เคยใช้ Excel มาก่อนรู้สึกตื่นเต้นประหลาดใจในศักยภาพของ Excel ว่าสามารถทำในสิ่งที่ไม่คิดว่าจะทำได้ โดยไม่ได้เตือนให้ทราบถึงความเสี่ยงในการใช้งาน

การอบรมที่ใช้สมมติฐานว่าแฟ้มที่สร้างขึ้นมานั้นสร้างขึ้นเพื่อใช้เองคนเดียวเป็นสมมติฐานที่ขัดกับความเป็นจริง หรือสอนให้ใช้ Excel ร่วมกันบนระบบเครือข่ายทั้งๆที่ควรหลีกเลี่ยง

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

การฝึกอบรมต้องมิใช่ให้ความรู้แต่เพียง Excel อย่างเดียว หากยังต้องให้ความรู้ในการวิเคราะห์ วางแผน ตรวจสอบ ควบคุม และพัฒนาระบบอีกด้วย หรืออย่างน้อยต้องมีจุดมุ่งหมายว่า เมื่อจบการอบรมไปแล้วต้องสามารถใช้ Excel สร้างงานให้คนอื่นใช้งานร่วมกันได้ในระยะยาว

นอกจากนี้แทนที่จะส่งพนักงานที่ใช้ Excel ทุกคนไปฝึกอบรมซึ่งเปลืองงบประมาณอย่างมากและใช่ว่าพนักงานเหล่านั้นจะอยู่ทำงานให้ตลอดไป ควรเริ่มจัดกลุ่มพนักงานซึ่งเกี่ยวข้องกับ Excel เป็นกลุ่มผู้สร้างกับกลุ่มผู้ใช้ เลือกพนักงานที่มีใจรัก Excel และมีความจงรักภักดีกับองค์กรให้ได้รับการฝึกอบรมอย่างเต็มที่แล้วให้ตำแหน่งงานพิเศษเป็น Microsoft Excel User Specialist เพื่อทำหน้าที่เป็นผู้สร้างงานให้ผู้อื่นใช้และสอนวิธีใช้แฟ้มที่สร้างให้กับพนักงานกลุ่มผู้ใช้ต่อไป ทั้งนี้ควรมีผู้สร้างงานอย่างน้อย 2 คนเพื่อทำหน้าที่แทนกันได้หรือช่วยตรวจสอบความถูกต้องให้แก่กันและกัน

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

แนวทางการอบรม Excel ที่ดีต้องมุ่งให้รอบรู้ก่อนรู้ลึกและมุ่งให้รู้จักคิดก่อนรู้จักทำ ก่อนเริ่มภาคปฏิบัติต้องให้ความรู้พื้นฐานภาคทฤษฎีเพื่อเข้าใจที่ไปที่มา และทราบวิธีคิดตัดสินใจในการเลือกใช้เครื่องมือต่างๆที่ Excel มีอยู่มากมายให้เหมาะกับงาน ต้องเปิดหูเปิดตาสาธิตให้เห็นตั้งแต่วิธีง่ายๆจนถึงขั้นยากที่ต้องอาศัยความชำนาญขั้นสูง พอถึงภาคปฏิบัติให้ทดลองใช้ Excel อย่างง่ายไปก่อนโดยพยายามใช้กับปัญหาหลายๆแบบ หากมีเวลาพอและเห็นว่าผู้เข้าอบรมพอรับไหวจึงเพิ่มความยากให้มากขึ้น

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

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

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

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

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

หลีกเลี่ยงการใช้แฟ้มพร้อมกันบนระบบเครือข่าย เพราะสร้างปัญหาให้เกิดขึ้นมากกว่าประโยชน์ที่ได้รับ ลองใช้ Google ค้นหาโดยใช้คำว่า “excel shared file problems” จะพบปัญหาแสดงขึ้นมานับล้านเรื่อง

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

ไมโครซอฟท์ตระหนักดีถึงความเสี่ยงที่เกิดจากการใช้โปรแกรม Excel จึงสร้างโปรแกรมพิเศษใน Office Professional Plus 2013 ทำหน้าที่เปรียบเทียบหาข้อมูลในแฟ้มที่ต่างกัน โดยเรียกใช้ผ่านเมนู Office 2013 Tools (ศึกษารายละเอียดเพิ่มเติมได้จาก Spreadsheet management with the New Office http://go.microsoft.com/fwlink/p/?LinkId=280264)

นอกจากนี้ยังสร้าง Discovery and Risk Assessment Server และ Office Audit and Control Management Server ที่ทำงานบนระบบ Server ช่วยควบคุมและสร้างรายงานการใช้แฟ้ม Excel ตลอดจนค้นหาเซลล์สูตรที่ผิดพลาดหรือไม่สอดคล้องกัน

แทนที่จะหันไปพึ่งระบบคอมพิวเตอร์เพื่อช่วยลดความผิดพลาดของมนุษย์ซึ่งต้องลงทุนอีกมาก ขอแนะนำให้นำระเบียบต่อไปนี้ไปติดประกาศให้พนักงานทุกคนปฏิบัติตาม

  1. เฉพาะแฟ้มสำคัญตามรายชื่อแฟ้มที่ผู้บริหารกำหนด เมื่อมีการแก้ไขเพิ่มเติมข้อมูลใดๆในแฟ้ม ให้พนักงานผู้เปิดแฟ้ม พิมพ์รายละเอียดของข้อมูลที่เปลี่ยนแปลงลงกระดาษแล้วใช้ปากกาสีขีดเส้นให้เห็นชัดว่าได้ทำการแก้ไขเพิ่มเติมข้อมูลส่วนใดและลงนามกำกับเพื่อส่งให้ผู้บริหารรับทราบ
  2. ถ้าตัวเลขใดยังไม่เคยมีมาก่อน ให้เว้นว่างในเซลล์นั้น
  3. ถ้าเคยมีตัวเลขและตอนนี้มีค่าเท่ากับ 0 เช่น รายการนั้นขายหมดแล้วหรือใช้ของจนหมดแล้ว ให้พิมพ์เลข 0 ลงไป
  4. ถ้าเคยมีตัวเลขแต่ตอนนี้ยังหาค่าไม่พบ ให้พิมพ์สูตร =NA() ลงไป (NA = Not available) หรือพิมพ์ข้อความว่า ยังหาค่าไม่ได้
  5. ในการลบข้อมูลต้องใช้วิธีกดปุ่ม Delete เท่านั้น ห้ามใช้วิธีเคาะวรรคแทนแล้วกดปุ่ม Enter เพราะการทำแบบนี้แม้จะไม่เห็นว่ามีข้อมูลเหมือนกับถูกลบทิ้งไปแล้วก็ตามแต่กลับมีวรรคมาแทนที่ ซึ่งวรรคถือเป็นตัวอักษรตัวหนึ่งที่ Excel ยังคงถือว่าเซลล์นั้นยังมีค่าบันทึกอยู่ ส่งผลให้สูตรทำงานผิดพลาดต่อไป
  6. ห้ามใส่วรรคขาดหรือใส่วรรคเกิน เช่นชื่อลูกค้า นาย ก กับ นายก แม้คนอ่านแล้วเข้าใจว่าเป็นลูกค้าชื่อนาย ก แต่ Excel ถือว่าเป็นคนละคนกัน
  7. ห้ามย่อบ้างไม่ย่อบ้าง มีจุดบ้างไม่มีจุดบ้าง เช่น คำว่าบริษัท ไมโครซอฟท์ จำกัด จะถูก Excel ถือว่าต่างจาก บ. ไมโครซอฟท์ จำกัด หรือ บริษัท ไมโครซอฟท์ จก หรือ บจก ไมโครซอฟท์ หรือ บ ไมโครซอฟท์ จก หรือ บ. ไมโครซอฟท์ จก.
  8. ห้ามพิมพ์ตัวเลขที่มีเลข 0 นำหน้า เช่น ต้องการบันทึกรหัสลูกค้า 01234 ซึ่งตามปกติถ้าพิมพ์ 01234 ลงไป Excel จะแสดงเพียงเลข 1234 เท่านั้น ทำให้เมื่อต้องการมีเลข 0 นำตัวเลขอื่น พนักงานอาจใช้เครื่องหมายฝนทองนำหน้าในการบันทึกเป็น ‘01234 หรือใช้คำสั่ง Format > Number > แบบ Text แทน ทำให้รหัสที่ดูว่าเป็นรหัสเดียวกันแต่ Excel ถือว่าต่างกัน ทางแก้ที่ง่ายที่สุดคือให้กำหนดตัวอักษรนำหน้าตัวเลขรหัสเสมอ เช่น c01234 เพื่อทำให้ Excel รับรู้ว่ามีสถานะเป็นตัวอักษรเสมอ
  9. ห้ามพิมพ์ข้อมูลใดที่มีบันทึกอยู่แล้วซ้ำโดยไม่จำเป็นโดยเฉพาะชื่อและรายละเอียดคำบรรยายรายการ เพราะการพิมพ์ซ้ำย่อมเปิดโอกาสให้สะกดผิดต่างไปจากข้อความที่ถูกต้อง ทางที่ดีควรใช้ Data Validation แบบ List ช่วยในการเลือกข้อมูลที่ต้องการ หรือใช้สูตรลิงค์ข้อมูลที่บันทึกไว้แล้วมาใช้ซ้ำจะเหมาะกว่า
  10. ห้ามใช้ปีพ.ศ.ในการบันทึกและห้ามกำหนดรูปแบบของวันเดือนปีเป็นพ.ศ. เช่น บันทึกลงไปว่า 14/2/2558 ซึ่ง Excel จะถือว่าเป็นวันที่ 14 เดือนกุมภาพันธ์ ปีค.ศ.2558 และถึงแม้จะใช้รูปแบบเปลี่ยนข้อมูลที่บันทึกถูกต้อง 14/2/2015 ให้แสดงเป็น 14/2/2558 ได้แล้วก็ตาม แต่ทำให้พนักงานคนอื่นลอก 14/2/2558 ตามที่เห็นไปบันทึกผิดตาม
  11. ห้ามพิมพ์วันที่ซึ่งเมื่อกดปุ่ม Enter แล้วจะเห็นว่าชิดซ้ายให้เองทันที เพราะแสดงว่าเป็นการบันทึกวันที่ในโครงสร้างซึ่ง Excel ไม่ยอมรับ
  12. ห้ามใช้ตัวเลขมาบันทึกปนกับตัวอักษร เช่น ข้อมูลยอดขายควรบันทึกเฉพาะตัวเลข 100 แต่กลับบันทึกตัวเลข 100 ตามด้วยคำว่า บาท ลงไปในเซลล์เดียวกัน หรือถ้ายังไม่เปิดขาย แทนที่จะปล่อยให้เซลล์เว้นว่างไว้ก่อน กลับพิมพ์บันทึกข้อความหมายเหตุส่วนตัวลงไปว่า ยังไม่เปิดขาย
  13. ห้ามบันทึกข้อมูลที่ไม่จำเป็น เช่น บันทึกคำว่า ขายแล้ว จองแล้ว รับของแล้ว เพราะหากมีวันที่ที่ขาย วันที่ที่จอง วันที่ที่รับของ ย่อมแสดงว่าเกิดเหตุการณ์นั้นๆอยู่แล้ว (ถ้าอยากจะแสดงข้อความเพื่อเตือน ให้ใช้สูตรเลือกแสดงข้อความแทนที่จะพิมพ์เอง)
  14. ห้ามสั่ง insert Row เพื่อบันทึกแทรกรายการใหม่ แต่ให้บันทึกข้อมูลรายการใหม่ต่อท้ายรายการล่าสุดเดิมที่มีอยู่แล้วเท่านั้น
  15. ห้ามลบรายการข้อมูลเดิมที่บันทึกไว้แล้วโดยเด็ดขาด
  16. ห้ามสั่ง sort เพราะลำดับข้อมูลจะเสียไปทันที หากต้องการสั่ง sort ต้องมีเลขลำดับรายการกำกับไว้จากน้อยไปมากเพื่อจะได้สั่ง sort ให้เรียงกลับสู่ลำดับรายการตามเดิม
  17. ห้ามเว้นว่างข้อมูลที่เป็นสาระสำคัญ โดยเฉพาะข้อมูลของชื่อ รหัส วันที่ ต้องมีข้อมูลเหล่านี้กำกับรายการไว้เสมอ
  18. ห้ามใช้สูตรใหม่ที่เพิ่งมีใน Excel 2007/2010/2013 หรือรุ่นใหม่ เพราะเมื่อนำแฟ้มกลับไปเปิดใน Excel 2003 หรือรุ่นก่อนนั้นสูตรจะไม่ทำงาน ควรรอจนกว่าจะมั่นใจว่าไม่มีใครใช้ Excel รุ่นเก่าอีกต่อไป
  19. ห้ามแก้ไขเซลล์สูตรที่แสดงผลเป็น error ให้เปลี่ยนเป็นค่าอื่นโดยไม่จำเป็น และห้ามเปลี่ยนเซลล์สูตรที่คืนค่าเท่ากับ 0 หรือ error เป็น Null Text โดยใช้ “” แทน
  20. ห้าม merge เซลล์ที่ต้องนำไปคำนวณต่อ เพราะการลิงค์เซลล์ที่ merge จะเกิดสูตรที่เพี้ยนต่างไปจากที่ต้องการได้ง่าย หากต้องการให้ตัวเลขแสดงอยู่กลางเซลล์หลายเซลล์ ให้ใช้คำสั่ง Format > Alignment > Horizontal แบบ Center across selection แทน
  21. ไม่ควรกำหนดสีหรือ font ตามใจจนมากเกินไป เพราะจะทำให้แฟ้มที่ตัวเองดูแล้วว่าสวยแต่อาจดูไม่ได้ในสายตาของคนอื่น และจะทำให้บุคคลภายนอกมองดูแฟ้มแล้วส่ายหน้าว่าบริษัทนี้ไม่มีมาตรฐานในการทำงาน
  22. ไม่ควรพิมพ์รหัสที่ยาวหลายหลักจนเกินไป โดยเฉพาะรหัสซึ่งกำหนดให้ใช้ตัวเลขหรือตัวอักษรแต่ละตัวมีความหมายในตัวเอง แต่ควรกำหนดรหัสใหม่ที่สั้นลงให้คนพิมพ์ได้ง่ายแล้วจึงใช้สูตรดึงรหัสยาวๆนั้นขึ้นมาแสดง เพื่อช่วยลดความผิดพลาดในการบันทึก

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

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

  • Row column เซลล์ และรูปภาพใน Excel สามารถซ่อนได้หลายวิธี ทำให้ยอดรวมไม่ตรงกับรายละเอียดที่แสดงและเมื่อ copy ออกไปอาจได้สิ่งที่ซ่อนตามไปด้วยหรือไม่ก็ได้ ขึ้นกับวิธีซ่อนที่ใช้และวิธี copy ออกไป
  • การที่มีเซลล์สูตรปะปนอยู่กับเซลล์ค่าคงที่จะทำให้เมื่อ copy ตารางออกไปใช้ที่อื่นโดยการกดปุ่ม Ctrl+v ได้ตารางที่ติดเซลล์สูตรตามไปด้วย ซึ่งตำแหน่งอ้างอิงในสูตรอาจผิดเพี้ยนไปจากเดิมทำให้แสดงข้อมูลผิดพลาด
  • รูปแบบสามารถทำให้ค่าที่แสดงบนจอและพิมพ์บนกระดาษแสดงค่าต่างจากค่าที่แท้จริง เช่น ตัวเลขบวกอาจใช้รูปแบบแสดงให้เห็นเป็นค่าลบหรือกลับกันก็ได้

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

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

ถ้าผู้ใช้แฟ้มเป็นระดับบริหารหรือใช้ Excel ไม่เก่ง ผู้สร้างแฟ้มต้องสร้างแฟ้มที่หาคำตอบเตรียมพร้อมไว้ให้แล้วจากการสร้างสูตรรอไว้ให้ตั้งแต่แรกหรือใช้ VBA สร้างหน้าจอพิเศษช่วยเหลือการใช้งานโดยต้องทดสอบจนมั่นใจในสูตรหรือ VBA ก่อน ไม่ควรสร้างงานที่ยึดถือการใช้คำสั่งบนเมนูใดๆ เช่น Filter หรือ Pivot Table ช่วยในการหาคำตอบหรือจัดโครงสร้างตารางใหม่ เพราะสิ่งที่เป็นผลจากการใช้คำสั่งบนเมนูจะยังคงแสดงค่าเดิมไปตลอดไม่เปลี่ยนแปลงตามการเปลี่ยนแปลงใดๆในตารางจนกว่าจะมีการใช้คำสั่งบนเมนูซ้ำใหม่ทุกครั้งเท่านั้น ต่างจากการสร้างสูตรช่วยคำนวณซึ่ง Excel จะคำนวณหาคำตอบใหม่ให้เองทันที

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

ถ้าผู้ใช้แฟ้มมีพื้นฐานในการใช้สูตรคำนวณบ้างแต่ไม่เก่งนัก ควรกระจายการคำนวณที่มีหลายขั้นตอนออกเป็นหลายขั้น โดยใช้ Range Name ตั้งชื่อให้กับเซลล์ แล้วใช้เซลล์ช่วยคำนวณแต่ละขั้น ใส่วงเล็บให้ชัดเจน แล้วส่งค่าไปใช้คำนวณต่อ เพื่อช่วยทำให้สามารถดูผลลัพธ์จากแต่ละขั้นว่ามีความหมายว่าอะไรและถูกต้องหรือไม่ อย่าซ้อนสูตรหลายสูตรในเซลล์เดียวจนกลายเป็นสูตรยาวมากจนแกะไม่ออก อย่าสร้างสูตร Array ที่ต้องกดปุ่ม Ctrl+Shift+Enter ซึ่งน้อยคนนักจะใช้เป็น

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

สำหรับตัวผู้สร้างแฟ้มเองและผู้ทดสอบแฟ้ม เมื่อต้องการปรับปรุงแก้ไขหรือตรวจสอบการคำนวณใดๆในตัวแฟ้มต้องทำได้ง่ายและเสียเวลาไม่มาก โดยรู้จักหลักการแยกแฟ้ม แยกชีท แยกตารางออกเป็นแต่ละเรื่องแต่ละส่วน สามารถออกแบบตารางคำนวณที่มีโครงสร้างเป็นมาตรฐานและใช้สูตรที่ง่ายต่อการตรวจสอบแก้ไข

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

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

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

แม้ในชีทหนึ่งของ Excel สามารถรองรับกับข้อมูลได้มากถึงล้านกว่ารายการ แต่ยังไม่ใช่สาเหตุที่ทำให้เลิกใช้ Access หรือโปรแกรมจัดการฐานข้อมูลอื่นแล้วหันมาใช้ Excel แต่ก็มิใช่จะคิดกันง่ายๆอีกเหมือนกันว่า ถ้างานใดที่เกี่ยวข้องกับการจัดเก็บข้อมูลต้องเลิกใช้ Excel แล้วหันไปใช้ Access หรือโปรแกรมฐานข้อมูลอื่นแทน (จากนี้ไปขอใช้คำว่า Access แทนโปรแกรมประเภทจัดการฐานข้อมูลซึ่งรวมทั้งโปรแกรมสำเร็จรูปด้วย)

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

Excel มีคุณลักษณะสำคัญที่เหนือกว่า Access อย่างมาก เนื่องจาก Excel มีความยืดหยุ่นพร้อมให้ใครก็ได้สามารถดัดแปลงแก้ไขโครงสร้างตารางได้ตลอดเวลาและทำได้ง่าย เพียงใช้เมาส์ลากเซลล์ไปวางที่ตำแหน่งอื่นในชีทอื่นหรือแฟ้มอื่น หรือจะแทรกเพิ่มลดรายการ ก็เห็นผลกับตาได้ทันที ซึ่งเรียกความสามารถนี้ว่า What you see is what you get (WYSIWYG หรืออ่านว่า วิส ซิ วิก) แม้ทำให้ตำแหน่งเซลล์เปลี่ยนไปในภายหลังแต่ Excel ยังคำนวณถูกต้องตามเดิม เพราะ Excel จะช่วยย้ายตำแหน่งอ้างอิงที่สร้างไว้ในสูตรตามไปให้เอง ส่วน Access ต้องรอให้ออกรายงานมาดูก่อนจึงจะรู้ว่าการแก้ไขที่ทำไปถูกต้องหรือไม่

หากงานใดที่ยังขาดมาตรฐาน ผู้ใช้งานยังไม่มั่นใจว่าโครงสร้างตารางจะเป็นอย่างไร ช่วงนี้ให้ใช้ Excel ไปก่อนและเลือกใช้สูตรที่ไม่พึ่งกับลักษณะโครงสร้างตาราง เช่น IF Choose Match Index หรือสูตร Array จากนั้นเมื่อข้อมูลมีโครงสร้างแน่นอนตายตัวเป็นมาตรฐานแล้วจึงพิจารณาต่อว่าจะใช้ Excel ต่อไปโดยเปลี่ยนไปใช้สูตร VLookup หรือ Pivot Table ก็ได้

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

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

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

Excel เป็นโปรแกรมที่สามารถนำมาใช้กับงานธุรกิจได้แทบทุกอย่าง ถึงจะด้อยกว่าโปรแกรมที่สร้างขึ้นมาเพื่อใช้กับงานเฉพาะด้าน เช่น Word, Access, PowerPoint, หรือแม้แต่ PhotoShop แต่ถ้าไม่ได้ต้องการสร้างงานชั้นเยี่ยมเช่นที่โปรแกรมเหล่านี้ทำได้ดีกว่า Excel อยู่แล้ว การที่โปรแกรม Excel มีราคาถูกกว่าและใช้งานได้เช่นเดียวกับโปรแกรมดังกล่าว จึงเป็นทางเลือกที่นิยมใช้ Excel กันอย่างมาก โดยเฉพาะธุรกิจขนาดเล็กพอคิดจะเริ่มต้นทำธุรกิจก็ต้องหาโปรแกรม Excel มาใช้ก่อนการหาโปรแกรมบัญชีสำเร็จรูปมาใช้เสียอีก

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

ถ้าใช้แต่ละชีทสร้างเป็นตารางรายงานแต่ละเดือน พอครบปีจะมี 12 ชีท แต่ถ้าเป็นรายงานรายวันพอครบปีจะมี 365 ชีท หรือถ้าเป็นรายงานตามรายสินค้าแต่ละประเภทจะมีจำนวนชีทนับร้อยนับพันชีทก็เป็นไปได้เพื่อแสดงตามประเภทสินค้าที่มีอยู่ ทำให้แฟ้มมีขนาดใหญ่มากและคอมพิวเตอร์ทำงานช้าลง หากแทนที่จะใช้ชีทแยกรายงานแต่กลับแยกเป็นแฟ้มขนาดเล็กก็จะมีจำนวนแฟ้มมากมาย เมื่อเวลาผ่านไปหลายปีก็ต้องซื้อคอมพิวเตอร์เครื่องใหม่ที่ทำงานเร็วขึ้นและใช้ฮาร์ดดิสก์ขนาดใหญ่ขึ้นมาเก็บแฟ้มทั้งหมดจึงจะพอ ซึ่งการใช้ Excel แบบนี้เป็นวิธีที่พบว่าใช้กันมากที่สุด อย่าว่าแต่มือใหม่เลย ผู้ที่ใช้ Excel มานานนับสิบปีก็ยังติดนิสัยสร้างงานแบบนี้ ซึ่งเป็นวิธีใช้ที่ไม่ได้แตกต่างจากการใช้เครื่องพิมพ์ดีดเท่าใดนัก ยังถือว่าห่างไกลจากการใช้ Excel แบบคอมพิวเตอร์

แม้การสร้างตารางเลียนแบบหน้ารายงานทำให้ผู้บริหารสามารถดูรายงานจากหน้าชีทได้ทันที แต่จะทำให้มีข้อมูลที่ต้องบันทึกซ้ำเต็มไปหมด เสี่ยงต่อการบันทึกผิดบ้างถูกบ้างต่างกันบ้าง เช่น วิบูลย์ บันทึกเป็น วิบุลย หรือ Terayut บันทึกเป็น Teeravut หรือ Pantip บันทึกเป็น Pantib เป็นต้น ซึ่ง Excel ถือว่าไม่ใช่ข้อมูลเดียวกัน และเมื่อต้องแก้ไขข้อมูลก็ต้องแก้ในทุกชีทหรือทุกแฟ้มทั้งหมดให้ตรงกัน เสี่ยงที่จะหลงลืมแก้ไขให้ครบทุกแห่ง

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

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

ในรหัส VBA หากมีค่าคงที่ ชื่อชีท และตำแหน่งเซลล์ (ตัวเข้ม) ต้องแก้ไขใหม่เสมอ

Sheets("TestOLDP").Select
lastRow = Range("B" & Rows.Count).End(xlUp).Row
For i = 1 To 21
Range("B3:B" & lastRow).Offset(0, i).FillDown
Next i

Excel เป็นโปรแกรมที่สามารถนำมาใช้งานแทนโปรแกรมสำเร็จรูป โดยขึ้นกับความรู้ความสามารถของผู้สร้างงานและต้องใช้เวลานานมาก กว่าจะสร้างแฟ้มงานที่ทำงานได้เหมือนโปรแกรมสำเร็จรูป

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

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

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

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

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

ตามแนวทางของผู้สอบบัญชี ผู้บริหารควรจัดให้มีการตรวจสอบการใช้สเปรดชีตโดยใช้หน่วยงานตรวจสอบภายใน หน่วยงานประเมินความเสี่ยง หน่วยงานทางระบบข้อมูล ฝ่าย IT หรือหน่วยงานเฉพาะกิจ ซึ่งมีความเชี่ยวชาญในการออกแบบแฟ้มสเปรดชีต เชี่ยวชาญในการใช้สูตรและ VBA เพื่อดำเนินงาน ดังนี้

image005

  1. ระบุกลุ่มของแฟ้มสเปรดชีตทั้งหมดที่เข้าข่ายต้องตรวจสอบ โดยการสัมภาษณ์ผู้ใช้งาน หรือตรวจสอบขั้นตอนการปฏิบัติงานที่ต้องใช้สเปรดชีต หรือจัดหาโปรแกรมคอมพิวเตอร์มาสแกนหาชื่อแฟ้มที่ใช้งาน
    • สอบถามผู้ปฏิบัติงานอย่างไม่เป็นทางการว่ามีแฟ้มสเปรดชีตที่ใช้อะไรบ้าง วิธีนี้เป็นวิธีที่ง่ายและรวดเร็วที่สุดแต่มีโอกาสสูงที่จะไม่ได้รายชื่อแฟ้มทั้งหมดที่ใช้อยู่เนื่องจากเป็นการสอบถามอย่างไม่เป็นทางการ
    • สร้างแผนผังการดำเนินงานแล้วทำหมายเหตุไว้หากขั้นตอนนั้นเกี่ยวข้องกับสเปรดชีต วิธีนี้ต้องเสียเวลามาก แต่ให้ข้อมูลที่ละเอียดกว่าการสอบถามและยังมีความเสี่ยงว่ายังไม่สามารถรวบรวมชื่อสเปรดชีตครบทั้งหมด
    • ใช้โปรแกรมคอมพิวเตอร์ค้นหารายชื่อแฟ้มสเปรดชีตผ่านระบบเน็ตเวิร์คและแต่ละเครื่องคอมพิวเตอร์ที่มีอยู่ วิธีนี้ให้ข้อมูลที่ละเอียดที่สุดแต่ยังขาดแฟ้มที่จัดเก็บไว้ในสื่ออื่นๆ เช่น FlashDrive หรือบนระบบอินเตอร์เน็ต
  2. รวบรวมรายละเอียดของแฟ้ม
    • ชื่อแฟ้มและขนาดแฟ้ม
    • ชื่อเจ้าของแฟ้มและชื่อผู้สร้างแฟ้ม
    • ชื่อผู้ใช้แฟ้ม
    • หน้าที่ของแฟ้มใช้สำหรับอะไร
    • แฟ้มเกี่ยวข้องกับด้านการเงินหรือการปฏิบัติงานทั่วไป (พบว่ากว่าร้อยละ 70 ของบริษัทใช้สเปรดชีตในงานที่สำคัญของธุรกิจ)
    • ขนาดของมูลค่าเงินหรือปริมาณงาน
    • ระดับความลับของข้อมูลในแฟ้ม
    • ระดับความอ่อนไหว (sensitive) ของข้อมูล
  3. กำหนดระดับความเสี่ยงให้กับแฟ้ม ตามระดับความซับซ้อนและความสำคัญ

    ความซับซ้อน (complexity) เกี่ยวข้องการระดับความยากง่ายในการคำนวณจากการใช้งานง่ายๆเพื่อแสดงข้อมูลเฉยๆไปจนถึงขั้นยากซึ่งใช้เครื่องมือระดับสูงช่วยในการคำนวณ เช่น ใช้ macro หรือ pivot table หรือมีการลิงค์ข้อมูลข้ามแฟ้ม หรือลิงค์มาจากโปรแกรมอื่นหรือเว็บ

    ความสำคัญ (magnitude) ตามมูลค่าของเงินหรือปริมาณทางการปฏิบัติงาน เช่น ปริมาณสินค้าหรือวัตถุดิบ หรือแบ่งตามระดับความเสียหายหากเกิดขึ้น เช่น เกิดความเสียหายต่อประเทศและสาธารณชน ละเมิดกฎเกณฑ์ เสียหายต่อการดำเนินธุรกิจ เสียหายต่อการปฏิบัติงานและความรับผิดชอบของบุคคลที่ใช้

    image006

    นอกจากนี้สามารถกำหนดระดับความเสี่ยงตามความถี่ที่ใช้แฟ้มว่าใช้เป็นประจำหรือไม่บ่อยนัก หรือเป็นแฟ้มที่ใช้คนเดียวหรือใช้ร่วมกันหลายคนหลายหน่วยงาน แม้มูลค่าตามตัวเงินจะไม่สูงแต่เมื่อต้องนำมาใช้บ่อยๆหรือใช้ร่วมกันหลายหน่วยงานย่อมก่อให้เกิดผลเสียหายได้มากขึ้น อีกทั้งประเมินความเสี่ยงจากประวัติของแฟ้มว่าผู้สร้างแฟ้มมีพื้นฐาน Excel ขนาดไหน เข้าใจหลักการออกแบบสเปรดชีตหรือไม่ และเคยมีการทดสอบมากน้อยเพียงใดก่อนที่จะนำแฟ้มมาใช้งาน อย่างไรก็ตามแม้ผู้สร้างแฟ้มมั่นใจร้อยเปอร์เซ็นต์ว่าแฟ้มของตนถูกต้องแน่นอน แต่จากการวิจัยพบว่าหากใช้คนหลายคนช่วยกันตรวจสอบจะพบว่าในแฟ้มสเปรดชีตมีสิ่งผิดพลาดอยู่อีก
  4. ตรวจสอบเงื่อนไขการใช้แต่ละแฟ้ม นำตารางข้อมูลในแฟ้มตรวจสอบกับฐานข้อมูลต้นทางว่าถูกต้องตรงกันหรือไม่ และทดสอบสูตรคำนวณว่าถูกต้องตรงตามเจตนาของผู้บริหารหรือไม่
  5. ประเมินนโยบายและขั้นตอนการใช้แฟ้มว่ามีระบบการควบคุมและตรวจสอบความถูกต้องเรื่อยไปตราบเท่าที่ยังใช้งานอยู่
    • เมื่อมีการแก้ไขเปลี่ยนแปลงในแฟ้ม ต้องมีตัวชี้ให้เห็นว่าต่างจากเดิมแล้ว เช่น ตั้งชื่อแฟ้มให้ต่างไปจากเดิมหรือทำหมายเหตุ (comment) ไว้ที่เซลล์
    • การแก้ไขได้รับการตรวจสอบและอนุมัติแล้วโดยบุคคลอื่นซึ่งไม่ได้เป็นผู้แก้ไข
    • ควรเก็บแฟ้มไว้ในระบบ server เพื่อควบคุมตัวผู้ใช้งาน
    • มีการทำสำรองข้อมูลไว้เป็นประจำและแยกเก็บแฟ้มสำรองไว้ต่างหาก
    • ตัวแฟ้มมีรหัสป้องกันการเปิดแฟ้มและมีระบบป้องกันผู้อื่นที่ไม่เกี่ยวข้องให้เข้าไม่ถึงตัวแฟ้ม
    • ตารางคำนวณหรือเซลล์สูตรมีรหัสป้องกันไม่ให้มีการแก้ไข

 

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

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

  1. จัดให้มีนโยบายและดำรงไว้ซึ่งระบบการควบคุมภายในที่เพียงพอตลอดรอบระยะเวลาที่ออกรายงานทางการเงิน
  2. จัดให้มีคณะกรรมการตรวจสอบที่เป็นอิสระและมีหน้าที่จัดทำรายงานกำกับดูแลกิจการ โดยเปิดเผยในรายงานประจำปี
  3. ประเมินความมีประสิทธิผลของระบบควบคุมภายในโดยใช้หลักเกณฑ์ที่เหมาะสม
  4. สนับสนุนผลการประเมินด้วยหลักฐานอย่างเพียงพอ
  5. สอบทานการควบคุมภายในและการปฏิบัติตามกฎของบริษัทให้มีประสิทธิผล
  6. ยืนยันประสิทธิผลของระบบการควบคุมภายในอย่างเป็นลายลักษณ์อักษรในการรายงานของผู้สอบบัญชีและหนังสือรับรองของผู้บริหารต่อผู้สอบบัญชี
  7. รายงานจุดอ่อนและการปฏิบัติตามระบบ โดยถือเป็นส่วนหนึ่งของรายงานประจำปี

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

เมื่อเกิดความเสียหายขึ้น ต้องกำหนดตัวเงินที่ผู้ที่เกี่ยวข้องต้องรับผิดชอบ เช่น ผู้สร้างแฟ้มรับผิดชอบในวงเงินไม่เกินกว่า 100,000 บาท ถ้ามีความเสียหายมากกว่านั้นให้หัวหน้าระดับถัดไปแบ่งความรับผิดชอบ แต่วิธีนี้มักทำให้ผู้สร้างแฟ้มประเมินความเสี่ยงต่ำไว้ก่อนเสมอจึงควรให้ฝ่ายควบคุมภายในร่วมในการประเมินความเสี่ยงและกำหนดวงเงิน

ในปีค.ศ. 2002 หลังวิกฤติเศรษฐกิจสืบเนื่องจากการฉ้อโกงรายงานทางการเงินของบริษัท Enron และบริษัทสำคัญอื่นๆ รัฐสภาสหรัฐอเมริกาได้ออกกฎหมาย Sarbanes-Oxley Act (SOX) โดยเฉพาะในหมวด 404 กำหนดให้ CEO ของบริษัทมหาชนต้องประเมินระบบรายงานทางการเงินของตนด้วยว่ามีประสิทธิภาพเพื่อประโยชน์ของผู้ถือหุ้น

Section 404 requires management and the external auditor to report on the adequacy of the company's internal control on financial reporting.

นอกจากนี้ยังมีกฎหมายและข้อบังคับอื่นอีก เช่น Solvency II, Base III, FDA 21, ISO 27002, IAS/IFRS for Accounting Standard, SAS 99 for auditor หรือข้อบังคับอื่นตามภาพ 

image004

สำหรับประเทศในทวีปเอเชีย ในปีค.ศ.2006 ญี่ปุ่นออกกฎหมาย J-SOX คล้ายคลึงกับ Sarbanes-Oxley Act

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

ส่วนประเทศไทยยังไม่มีกฎหมายหรือข้อบังคับใด จึงเป็นสถานการณ์ที่น่าเป็นห่วงอย่างยิ่ง

ในขณะที่องค์กรให้ความสำคัญและตระหนักถึงความเสี่ยงความเสี่ยงด้านต่างๆในการดำเนินธุรกิจนั้น แต่ความเสี่ยงจากการใช้สเปรดชีตหรือ Excel กลับถูกมองข้ามหรือให้ความสำคัญน้อยมาก จนกระทั่งในปีค.ศ.2002 รัฐสภาของสหรัฐอเมริกาได้ออกกฎหมาย Sarbanes-Oxley Act เพื่อช่วยกระตุ้นให้เริ่มคิดปรับปรุงระบบการใช้ Excel จากการกำหนดให้ CEO ต้องประเมินระบบรายงานทางการเงินของตนด้วยว่ามีประสิทธิภาพ

เนื่องจาก Excel มีราคาค่าโปรแกรมถูกมากเมื่อเทียบกับการลงทุนเป็นแสนเป็นล้านบาทในกิจกรรมอื่น ผู้บริหารจึงไม่ได้ให้ความสำคัญเร่งด่วน หรือรอจนกว่าจะมีกฎหมายหรือมาตรฐาน ISO มาบังคับก่อน

ยิ่งองค์กรเห็นความสำคัญมากขึ้นเท่าใด ยิ่งรีบขวนขวายหาทางกระตุ้นให้ปรับปรุงวิธีการใช้ Excel ให้รัดกุมมากขึ้นเท่านั้น

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

ภาพสะท้อนซึ่งแสดงให้เห็นว่าผู้บริหารไม่ได้ให้ความสำคัญกับความเสี่ยงจากการใช้ Excel ดูได้จาก

  1. การเลิกใช้โปรแกรม Excel แล้วหันไปใช้สเปรดชีตอื่นหรือใช้โปรแกรมที่แจกให้ใช้ฟรีเพื่อประหยัดต้นทุน เพราะเข้าใจว่าไม่ว่าจะใช้สเปรดชีตยี่ห้อใดก็นำมาใช้คำนวณตัวเลขได้เหมือนกัน โดยไม่รู้ว่า Excel มีความสามารถเหนือกว่าสเปรดชีตอื่นอย่างมาก และไม่ตระหนักถึงค่าเสียโอกาสที่มีต้นทุนแพงจากการเปลี่ยนไปใช้โปรแกรมฟรี
  2. เมื่อพบว่า Excel คำนวณผิดพลาดหรือแสดงข้อมูลไม่ตรงกับความต้องการก็จัดการแก้ปัญหาเป็นครั้งไป ไม่ได้วางนโยบายหรือออกระเบียบเป็นลายลักษณ์อักษรเพื่อป้องกันไม่ให้เกิดความผิดพลาดขึ้นอีกในอนาคต
  3. ไม่เห็นความจำเป็นในการส่งพนักงานไปฝึกอบรมเพราะเสียดายเวลางาน มองว่า Excel เป็นโปรแกรมใช้ง่ายและเรียนจากหนังสือคู่มือได้เอง ใครๆก็มีวิธีใช้เหมือนกัน ไม่คุ้มที่จะจ่ายเงินค่าฝึกอบรม
  4. ถ้าใครอยากจะเข้าอบรมก็ห้ามใช้เวลางานลาไปเรียนและต้องออกเงินเรียนเอง หรือถ้ายอมส่งไปอบรมก็ไม่บ่อยนัก ให้เวลาสำหรับการอบรมไม่กี่วันและหาที่เรียนกันเอง โดยเลือกเรียนจากที่ไหนก็ได้เพราะเชื่อว่าได้ความรู้ไม่ต่างกัน ขอให้เน้นอบรมเฉพาะเรื่องที่จะเอาไปใช้งานได้ทันทีกับปัญหาเฉพาะหน้าก็แล้วกัน

ส่วนสาเหตุที่ผู้ใช้งานไม่เห็นความสำคัญในความเสี่ยงจากการใช้ Excel มีดังนี้

  1. มีความมั่นใจอย่างยิ่งว่าแฟ้มที่ตนสร้างขึ้นปราศจากความผิดพลาดโดยสิ้นเชิง
  2. เชื่อว่าการที่แฟ้มมีความผิดพลาดบ้างเล็กน้อยเป็นเรื่องธรรมดา
  3. ไม่เคยเห็นตัวอย่างวิธีการสร้างงานที่ดีกว่า
  4. ขาดความรู้ในวิธีการทดสอบและตรวจสอบเพื่อหาความผิดพลาด
  5. มองไม่ออกว่าเมื่อเกิดความผิดพลาดขึ้นจะส่งผลเสียต่อองค์กรอย่างไร
  6. คิดว่าเป็นหน้าที่ของผู้บริหาร ไม่ใช่หน้าที่ความรับผิดชอบของตน
  7. ต้องการความอิสระ ไม่ต้องการให้มีใครมาควบคุม ตรวจสอบ หรือคอยจับผิด
  8. กำลังจะลาออก จึงไม่สนใจว่าใครจะนำแฟ้มที่ตนสร้างมาใช้งานต่อหรือไม่แล้วจะเกิดผลเสียอย่างไร
  9. แอบซ่อนข้อมูลทุจริตเอาไว้

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

ยิ่งเก่ง Excel มากขึ้นเท่าใด ยิ่งสามารถมองข้อผิดพลาดของผู้อื่นได้มากขึ้นเท่านั้น โดยเฉพาะวิธีใช้ Excel ที่นิยมใช้กันของคนทั่วไปซึ่งมักมองไม่ออกว่ามีความเสี่ยงแฝงอยู่ เช่น การใช้สูตร VLookup หรือคำสั่ง Pivot Table ก็เหมาะกับบางงานและผู้ใช้บางระดับเท่านั้น หรือการใช้แป้นพิมพ์ลัด Ctrl+v เพื่อลอกข้อมูลก็เสี่ยงที่จะได้ข้อมูลผิด เป็นต้น

เป็นระยะเวลากว่า 36 ปีแล้วที่โปรแกรมสเปรดชีตถูกนำมาใช้ในสำนักงาน ก่อนหน้านั้นสเปรดชีตเป็นโปรแกรมที่ทำงานบนคอมพิวเตอร์ระดับเมนเฟรมซึ่งมีใช้ในบริษัทขนาดใหญ่เท่านั้น ทุกวันนี้มันกลายเป็นโปรแกรมที่ขาดไม่ได้ในการทำงาน โดยเฉพาะโปรแกรม Microsoft Excel ซึ่งมีผู้ใช้ทั่วโลกกว่า 500 ล้านคน และแม้จะมีโปรแกรมสำเร็จรูปสร้างขึ้นมาเพื่อใช้ในงานด้านการเงินหรืองานอื่นในช่วงเวลาที่ผ่านมาก็ตาม แต่ Excel ยังคงเป็นโปรแกรมพื้นฐานสำหรับการทำรายงานการเงิน การวิเคราะห์ หรือใช้สำหรับทุกเรื่องที่เกี่ยวข้องกับตัวเลข หากปราศจากโปรแกรมสเปรดชีตหรือ Excel แล้ว โลกของเราจะต่างไปจากทุกวันนี้อย่างสิ้นเชิง

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

Excel เป็นโปรแกรมสเปรดชีตซึ่งไม่ได้สร้างขึ้นมาเพื่อใช้ในธุรกิจ ต่างจากโปรแกรมสำเร็จรูปที่สร้างขึ้นมาขายหรือพัฒนาโดยฝ่าย IT ซึ่งตัวโปรแกรมเมอร์ต้องมีพื้นฐานในการสร้างโปรแกรมโดยเฉพาะ อย่างน้อยต้องสำเร็จการศึกษาด้าน IT และก่อนที่จะปล่อยโปรแกรมออกมาให้ใช้งานต้องตรวจสอบแล้วตรวจสอบอีกว่าไม่ผิดพลาด เมื่อใช้งานก็ต้องตรวจสอบควบคุมให้เป็นไปตามที่กำหนด

ตลอดระยะเวลากว่า 36 ปีนั้น ระบบคอมพิวเตอร์มีความทันสมัยและซับซ้อนมากขึ้นอย่างมากจนเป็นไปไม่ได้ที่ใครคนใดคนหนึ่งจะรู้ลึกทุกเรื่องและเชี่ยวชาญทุกอย่าง เจ้าหน้าที่ฝ่าย IT มักมีความรู้เรื่องโปรแกรม Excel น้อยกว่าพนักงานที่ใช้งานเป็นประจำ ฝ่าย IT จึงทำหน้าที่ดูแลรับผิดชอบเฉพาะเรื่องที่ตัวเองถนัด เช่น ระบบเครือข่าย เครื่องมือเครื่องใช้ด้านคอมพิวเตอร์ และโปรแกรมสำเร็จรูปที่จัดหามาใช้ แล้วปล่อยให้ใช้ Excel อย่างอิสระให้ผู้ใช้งานรับผิดชอบกันเอง โดยไม่มีการวางนโยบายหรือมีระเบียบปฏิบัติเกี่ยวกับการใช้สเปรดชีตแม้แต่น้อย เมื่อไร้การควบคุมย่อมเปิดโอกาสให้ง่ายต่อการทุจริต ใช้งานผิดพลาด หรือไร้มาตรฐาน

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

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

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

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

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

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

ใน Excel รุ่นใหม่มีความสามารถเหนือกว่ารุ่นก่อน พื้นที่ตารางในชีทหนึ่งๆสามารถรองรับกับข้อมูลนับล้านรายการ (1,048,576 rows และ 16,384 columns) มีจำนวนเซลล์มากถึง 17,179,869,184 เซลล์ในชีทหนึ่งๆ และสร้างสูตรซ้อนกันได้ถึง 64 ชั้น ผู้ใช้ Excel ที่เก่งด้านคำนวณสามารถใช้ Excel สร้างแฟ้มที่มีโครงสร้างการคำนวณซับซ้อนอย่างมาก ทำให้ยากสำหรับผู้ใช้แฟ้มทั่วไปหรือเจ้าหน้าที่ตรวจสอบภายใน (หรือแม้แต่ตัวผู้สร้างเอง) จะตรวจสอบได้ครบทุกเซลล์ เป็นความเสี่ยงที่ยากจะตรวจพบว่ามีข้อมูลคลาดเคลื่อนหรือผิดพลาด

ผลจากการวิจัยพบว่า 94% ของจำนวนแฟ้มสเปรดชีตที่ใช้ในบริษัททั่วไปและ 5% ของสูตรที่สร้างไว้มีข้อผิดพลาด

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

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

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

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

จากการวิจัยพบว่ากว่า 94% ของจำนวนแฟ้มสเปรดชีตที่สร้างขึ้นมาใช้งานมีข้อผิดพลาด

ใครก็ตามซึ่งมั่นใจว่าแฟ้มถูกต้องโดยไม่มีข้อผิดพลาดเลย มีแนวโน้มที่จะละเลยมองข้ามข้อผิดพลาดที่มี และมักเป็นความมั่นใจของผู้ที่ไม่รู้จริงในวิธีการใช้ Excel

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

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

ความเสี่ยงในแง่การลงทุนเกิดขึ้นเมื่อใช้ Excel ไม่คุ้มค่า หากพนักงานสามารถใช้ Excel ได้แค่อย่างเครื่องคิดเลขหรือเครื่องพิมพ์ดีด ไม่สามารถใช้งาน Excel ทำงานแบบอัตโนมัติได้อย่างคอมพิวเตอร์ และไม่ได้ช่วยทำให้สามารถนำแฟ้มที่สร้างขึ้นมาใช้ซ้ำแล้วซ้ำอีก

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

  • แค่ cut-and-paste หรือการลอกข้อมูลมาใช้ผิดพลาด ทำให้บริษัท TranAlta สูญเงินไป 24 ล้านดอลลาร์สหรัฐ เมื่อให้ราคาต่ำไปในการประมูลสัญญาลงทุนด้านพลังงานไฟฟ้า
  • Allied Irish Bank/Allfirst พบการทุจริตเงิน 700 ล้านดอลลาร์สหรัฐเพียงสร้างสูตรลิงก์เชื่อมโยงข้อมูลปลอมมาใช้
  • บริษัทโทรคมนาคมแห่งหนึ่งลงทุนนับล้านในระบบการวางบิลแต่พบว่าเงื่อนไขในการคำนวณค่าโทรศัพท์ซับซ้อนมากและเปลี่ยนแปลงบ่อยครั้งจนฝ่าย IT ไม่สามารถสร้างโปรแกรมมาให้ใช้ทัน จึงหันไปใช้สเปรดชีทในการคำนวณแทน ต่อมาเมื่อตรวจสอบอย่างละเอียดจึงพบว่ามีข้อผิดพลาด ส่งผลทำให้บริษัทเสียชื่อเสียงที่ตีเป็นค่าเงินมิได้
  • ราคาหุ้นของ C&C ตกลงไป 15% หลังจากพบว่าโอนข้อมูลผิดพลาดจากระบบบัญชีมาสู่สเปรดชีตเพื่อรายงานการค้าหุ้น
  • ในปีค.ศ. 2003 Fannie Mae รายงานยอดทางบัญชีผิดถึง 1.2 พันล้านดอลลาร์สหรัฐ เกิดจากข้อผิดพลาดในสเปรดชีต
  • แค่ขาดเครื่องหมายลบทำให้ Magellan Fund รายงานผลประกอบการสูงไป 2.6 พันล้านดอลลาร์สหรัฐและไม่สามารถจ่ายเงินปันผลตามที่สัญญาไว้
  • บริษัทด้านสาธารณูปโภคแห่งหนึ่ง พบในวินาทีสุดท้ายว่าใส่วงเล็บในสูตรคำนวณผิด ทำให้ยอดกำไรตกจาก 200 ล้านดอลลาร์สหรัฐเหลือเพียง 25 ล้านดอลลาร์
  • แม้บริษัทมีโปรแกรมบัญชีใช้งานอยู่แล้วแต่ยังไม่สามารถออกรายงานตามความต้องการที่เปลี่ยนไปเสมอของฝ่ายการเงิน จึงหันไปใช้สเปรดชีตในการออกงบการเงินเพื่อรายงานต่อผู้บริหารระดับสูง และเนื่องจากระบบควบคุมภายในตรวจสอบไปไม่ถึงสเปรดชีตที่ใช้รายงาน เมื่อมีการตรวจสอบสเปรดชีตอย่างละเอียดจึงพบว่าคำนวณยอดค้างรับค้างจ่ายผิดพลาด
  • ผู้บริหารบริษัทให้บริการทางสาธารณสุขยอมรับกับผู้สอบบัญชีว่า ได้แสดงยอดทรัพย์สินเป็นเท็จโดยทำให้รายรับมีมูลค่าสูงกว่าความเป็นจริงถึง 3.5 พันล้านดอลลาร์สหรัฐ
  • เจ้าหน้าที่ตลาดหลักทรัพย์ทำการซื้อขายผิดพลาดและแสดงยอดขาดทุนสูงมาก เพราะแฟ้มสเปรดชีตที่ใช้อยู่นั้นเป็นแฟ้มที่เจ้าหน้าที่คนก่อนสร้างไว้อย่างซับซ้อนเกินกว่าจะเข้าใจได้และไม่ทราบมาก่อนว่ามีขั้นตอนพิเศษที่ผู้ใช้แฟ้มต้องคอยทำหน้าที่ควบคุมเงื่อนไขจึงจะคำนวณได้ถูกต้อง
  • รายงานปริมาณยารักษาโรคที่แสดงในตารางว่ามีหน่วยเป็น milligrams (mg) แต่บางรายการกลับใช้หน่วยเป็น micrograms (mcg) ทำให้เกิดความผิดพลาดในการรักษา
  • ในปีค.ศ. 2010 ผลการวิจัยของอาจารย์มหาวิทยาลัย Harvard คำนวณการขยายตัวทางเศรษฐกิจของโลกติดลบ 0.1% เพราะลืมนำข้อมูลของ 5 ประเทศแรกมารวมคำนวณด้วย (ซึ่งรวมถึงประเทศออสเตรเลียและคานาดา) ซึ่งที่ถูกต้องนั้นเศรษฐกิจโตขึ้น 2.2%
  • บริษัท JPMorgan ประเมินความเสี่ยงของ credit derivatives bets ต่ำกว่าความเป็นจริงถึงครึ่งหนึ่ง เพราะนำตัวแปรไปบวกแทนที่จะนำไปหาค่าเฉลี่ย ทำให้ค้าขายขาดทุนถึง 6.2 พันล้านดอลลาร์สหรัฐ เจ้าหน้าที่ถูกไล่ออก และผู้บริหารถูกเรียกตัวไปให้การต่อรัฐสภา
  • ในปีค.ศ. 2008 บริษัท Barclays ซื้อบริษัท Lehman Brothers ในมูลค่าที่สูงกว่าความเป็นจริง เพราะผู้สร้างแฟ้มข้อมูลทรัพย์สินซ่อนเซลล์ที่ควรจะถูกลบเอาไว้เกือบ 200 เซลล์ซึ่งเป็นทรัพย์สินที่ไม่ต้องการมูลค่าถึง 30 ล้านดอลลาร์สหรัฐ
  • ผู้บริหารระดับสูงด้านการเงินของรัฐยูทาถูกไล่ออก เพราะคำนวณจำนวนเด็กนักเรียนที่จะเข้าเรียนในสถานศึกษาของรัฐต่ำไป เนื่องจากใส่ตำแหน่งอ้างอิงในสูตรผิดพลาด ทำให้ตั้งงบประมาณทางการศึกษาต่ำไปถึง 25 ล้านดอลลาร์สหรัฐ
  • ราคาหุ้นของบริษัท C&C ตกลงไป 15% เป็นผลจากรายงานผิดพลาดว่ารายได้เพิ่มขึ้น 3% ทั้งที่ถูกต้องคือรายได้ลดลง 5% เกิดจากการโอนข้อมูลจากโปรแกรมระบบบัญชีมาทำรายงานที่ต้องส่งให้ตลาดด้วยสเปรดชีตผิดพลาด
  • มหาวิทยาลัย Toledo เสียเงินงบประมาณกว่า 2.4 ล้านดอลลาร์สหรัฐ เนื่องจากพิมพ์สูตรผิด
  • ตัวแทนการจัดซื้อของรัฐบาลฮังการีถูกปรับ 2 ล้านฟอรินท์และระงับการประมูล เนื่องจากส่งแฟ้มให้กลุ่มผู้ส่งสินค้าซึ่งเข้าใจวิธีใช้งานผิด แทนที่จะใช้ข้อมูลที่บันทึกไว้อยู่แล้วกลับใช้การกรอกข้อมูลด้วยมือ

ความเสียหายเหล่านี้เป็นเพียงความเสียหายส่วนที่เกิดข้อพิพาททำให้ต้องเปิดเผยต่อสาธารณชนเท่านั้น ยังมีความเสียหายอีกมากมายที่เก็บเป็นความลับหรืออายไม่อยากเปิดเผย

ดูความเสียหายอื่นๆที่เกิดขึ้นจากการใช้สเปรดชีต ได้จากเว็บ European Spreadsheet Risk Interest Group (EuSPrIG) http://www.eusprig.org/horror-stories.htm ซึ่งเกิดจากการรวมตัวกันของ The European Spreadsheet Risks Interest Group เพื่อกระตุ้นให้สังคมตระหนักถึงความเสี่ยงจากการใช้สเปรดชีต โดยนำความเสียหายที่เกิดขึ้นกับแต่ละกิจการมาเปิดเผยให้ทราบกันไว้ในหัวข้อ Horror Stories

“A Life Without Risk Is Not Worth Living” เป็นคำกล่าวของ Charles Lindbergh นักบินชาวอเมริกันผู้สร้างสถิติบินเดี่ยวข้ามทวีปโดยไม่หยุดพักจากนิวยอร์กไปปารีสเป็นครั้งแรก เป็นข้อความที่กระตุ้นให้เห็นว่าการใช้ชีวิตอย่างเสี่ยงบ้างจะทำให้รู้สึกว่าชีวิตมีค่ามากขึ้น แต่ถ้าใช้ชีวิตอยู่กับการใช้ Excel ทุกวันแต่ไม่มั่นใจในวิธีที่ใช้ Excel อยู่ว่ามีช่องโหว่หรือไม่ ยังรู้สึกว่าเสี่ยงอยู่เสมอเพราะกลัวว่าพรุ่งนี้ลูกน้องที่เก่ง Excel อยู่คนเดียวจะลาออกไป ความเสี่ยงแบบนี้ไม่ทำให้รู้สึกว่าชีวิตมีค่ามากขึ้นเป็นแน่

ทุกวันนี้คนทั่วไปชอบใช้โปรแกรม Excel สำหรับเก็บตัวเลขแทบทุกอย่างในชีวิตประจำวัน ไม่ว่าบริษัทเล็กใหญ่ SME บริษัทข้ามชาติขนาดใหญ่ ตลอดจนหน่วยงานของรัฐ ถ้านับรวมกิจกรรมทางการเงินแล้วมีค่าเป็นล้านล้านบาท ล้วนพึ่งพาโปรแกรมสเปรดชีตที่มีชื่อว่า Microsoft Excel เป็นเครื่องมือหลักในการทำงานกันทั้งนั้น หากอยู่ดีๆแฟ้มที่สร้างจาก Excel เกิดหยุดคำนวณขึ้นมาโดยไม่ทราบสาเหตุ ย่อมสร้างความเสียหายตามมาอย่างมหาศาล

ประมาณ 1.3 พันล้านคนใช้โปรแกรม Microsoft Office โดยส่วนใหญ่ใช้โปรแกรม Microsoft Excel

กว่า 70% ของบริษัทในสหรัฐอเมริกาใช้สเปรดชีตในการวางแผนกลยุทธ์
95% ใช้สเปรดชีตในการรายงานทางการเงิน
47% ของบริษัทขนาดกลางใช้สเปรดชีตในการวางแผนและงบประมาณ
80% ของบริษัทข้ามชาติที่ไปดำเนินธุรกิจในสหรัฐอเมริกาใช้สเปรดชีตในการดำเนินงานทั่วไปและรายงานการเงิน

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

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

จากจุดเด่นในความยืดหยุ่นในการใช้งานและราคาที่ถูกกว่าของ Excel เป็นปัจจัยที่ดึงดูดใจทำให้ความนิยมใช้ Excel มีเพิ่มมากขึ้น แต่ความยืดหยุ่นซึ่งเป็นจุดเด่นนี่เองกลับกลายเป็นความเสี่ยงที่ทำให้ต้องคิดพิจารณาให้ถี่ถ้วนก่อนว่าเหมาะจะนำ Excel มาใช้กับงานประเภทนั้นหรือไม่ ตราบใดที่ Excel ยังยอมให้มนุษย์เข้าไปมีส่วนควบคุมการทำงานของ Excel ได้โดยตรงหรือผ่านการใช้คำสั่งบนเมนูได้เอง ตราบนั้นย่อมเท่ากับยังคงเปิดโอกาสให้เกิดความผิดพลาดจากตัวผู้ใช้งาน (Human Error) ได้ตลอดเวลา และเมื่อนำแฟ้มไปใช้งานพร้อมกันหรือส่งแฟ้มให้คนอื่นใช้งานต่อแล้วเกิดความผิดพลาดขึ้นก็ยากจะหาตัวผู้รับผิดชอบ ถึงจะใช้โปรแกรม VBA มาเสริมเพื่อช่วยทำให้ Excel ทำงานเองโดยอัตโนมัติแล้วใส่รหัสป้องกันแฟ้มไว้ก็สามารถหาโปรแกรมฟรีจากอินเตอร์เน็ตมาถอดรหัสป้องกันได้ง่าย ใครก็ไม่รู้ที่เปิดแฟ้มได้จะสามารถย้อนไปแก้ไขข้อมูลที่เก็บไว้อย่างปราศจากร่องรอย

เกือบ 94% ของแฟ้มสเปรดชีตที่ใช้มีสิ่งผิดพลาด แม้แต่แฟ้มที่สร้างมาอย่างดี ยังมีสิ่งผิดพลาดอยู่อย่างน้อย 1% ของจำนวนเซลล์ และ 5.2% ของสูตร

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

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

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

“ประยุกต์” แปลว่า การนำความรู้ในวิทยาการต่าง ๆ มาปรับใช้ให้เป็นประโยชน์

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

วิธีประยุกต์ใช้ Excel แบ่งตามขั้นตอนการทำงาน

ก่อนจะเริ่มลงทุนทำธุรกิจต้องมีการวิเคราะห์ความเป็นไปได้ในการลงทุน (Feasibility Study) เพื่อตัดสินใจว่าควรลงทุนตั้งบริษัทไหม จะเพิ่มสายการผลิตหรือไม่ โดยคำนวณหาผลตอบแทนจากการลงทุนที่เรียกว่า IRR (Internal Rate of Return) กับ NPV (Net Present Value)

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

BOM

ตามภาพนี้เป็นโครงสร้างการผลิต (BOM - Bill of Materials) แสดงถึงการผลิตสินค้าชื่อ A จำนวน 1 ชิ้น ต้องใช้เวลาผลิต 1 วัน (Unit=1, Lead Time LT=1) โดยใช้วัตถุดิบชื่อ B และ C

ในการประกอบ A 1 ชิ้นต้องใช้วัตถุดิบชื่อ B จำนวน 2 ชิ้น แต่กว่าจะได้ B มาใช้ต้องเสียเวลาผลิต B 2 วัน (Unit=2, Lead Time LT=2) และในการประกอบ A 1 ชิ้นต้องใช้วัตถุดิบชื่อ C จำนวน 3 ชิ้น แต่กว่าจะได้ C มาใช้ต้องเสียเวลาผลิต C 1 วัน (Unit=3, Lead Time LT=1)

โครงสร้างยังมีลำดับย่อยต่อไปอีกของวัตถุดิบ D E F G

ผู้ใช้ Excel ต้องสามารถประยุกต์ใช้ Excel ในการหาว่า ถ้าต้องการสินค้า A จำนวน 50 ชิ้นในวันที่ 8 ว่าจะต้องเตรียมสั่งวัตถุดิบ B C D E F G ในวันที่เท่าใด และจำนวนกี่ชิ้นจึงจะผลิต A เสร็จพอดีตามจำนวนที่ต้องการ ซึ่งในความเป็นจริงยังต้องคำนึงถึงจำนวนสินค้าคงคลังและเงื่อนไขการซื้อวัตถุดิบอีกด้วย

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

ในช่วงกว่ายี่สิบปีที่ผมเป็นวิทยากรสอน Excel มีผู้สนใจอยากจะให้ผมสอนหลักสูตรวิธีศึกษาความเป็นไปได้หรือที่เรียกติดปากกันว่า “ทำฟีส” อยู่เสมอ ซึ่งแทบทุกครั้งผมต้องปฏิเสธกลับไป มีอยู่ครั้งเดียวเท่านั้นที่ผมรับสอนการทำฟีส ครั้งนั้นตั้งใจจะเปิดหลักสูตรนี้ที่สมาคมส่งเสริมเทคโนโลยี (ไทย-ญี่ปุ่น) แต่พบว่าพอจะถึงวันอบรมมีผู้สนใจสมัครแค่ไม่กี่คน ทางสมาคมจึงปิดหลักสูตรนี้ไป ส่วนผู้ที่สนใจก็ขอร้องให้ผมเปิดสอนส่วนตัวให้ที่บ้าน เป็นบทเรียนสำคัญที่ทำให้ผมรู้ว่าไม่ควรรับสอนหลักสูตรทำฟีสนี้เด็ดขาด ทำไมน่ะหรือครับ เพราะพื้นฐานของผู้เข้าอบรมต้องมีพร้อมที่จะรับความรู้ด้วย

การหาอัตราผลตอบแทนที่เราเรียกกันว่า IRR (Internal Rate of Return) กับ NPV (Net Present Value) นั้นไม่ใช่เรื่องยากเพราะ Excel มีสูตรสำเร็จรูปเตรียมพร้อมให้ใช้งานได้ทันที ตัวผมก็เรียนปริญญาโท MBA Finance จาก University of Wisconsin โดยเน้นด้าน Capital Budgeting ถ้าใช้ความรู้จากที่เรียนมานำมาสอน Excel ทำฟีสก็ทำได้อยู่แล้ว แต่ในการทำฟีสเพื่อตัดสินใจลงทุนของจริงนั้นไม่ได้ง่ายอย่างที่สอนในห้องเรียนหรือตามที่แนะนำกัน

Feas01

วิธีการคำนวณอัตราผลตอบแทนที่แนะนำให้ใช้กันทั่วไป ตามภาพนี้จะใช้ตัวเลขกระแสเงินสดสุทธิในบรรทัดสุดท้ายที่ตีกรอบไว้ไปใช้ในการคำนวณหา IRR กับ NPV โดยคำนวณหาตัวเลขมาจากยอดกำไรสุทธิ บวกกลับด้วยค่าเสื่อมราคา แล้วปรับต่อด้วยยอดรายการค้างรับค้างจ่าย (ตามภาพนี้สมมติว่าไม่มีรายการค้างรับค้างจ่ายเสียอีก) เพื่อให้เป็นตัวเงินสดคงเหลือในแต่ละปี จากนั้นจึงนำไปคำนวณร่วมกับเงินลงทุน ซึ่งจากสายตาก็ตัดสินใจได้ไม่ยากแล้วเพราะจากเงินลงทุน 2.4 ล้านบาทสามารถสร้างกระแสเงินสดสุทธิในปีต่อมามากมายหลายเท่าตัว กลายเป็นภาพลวงตาที่ชัดเจนว่าเมื่อนำตัวเลขไปหา IRR หรือ NPV on Project ต้องได้อัตราผลตอบแทนที่พุ่งทะลุกราฟอย่างแน่นอน

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

การคำนวณอัตราผลตอบแทนที่ถูกต้อง ต้องตอบให้ได้ก่อนว่า ใครเล่าที่สนใจดูผลตอบแทนมากที่สุด ซึ่งก็คือผู้ถือหุ้นใช่หรือไม่ จากยอดทรัพย์สินถาวรที่ต้องลงทุน เมื่อขอกู้เงินจากธนาคารๆย่อมไม่ให้กู้เต็มจำนวน แต่จะกำหนดให้เจ้าของกิจการต้องออกเงินเองด้วยซึ่งเรียกว่า Equity Financing ซึ่งสิ่งที่จะคืนทุนมาเป็นกำไรให้กับผู้ถือหุ้นก็คือเงินปันผล ดังนั้นในแง่ของเจ้าของกิจการต้องใช้กระแสเงินสดจากส่วนของผู้ถือหุ้นและเงินปันผลในการคำนวณหา IRR กับ NPV ยอดเงินปันผลที่จะแบ่งจ่ายออกมาจากกำไรนั้นก็ไม่สามารถจ่ายออกมาทั้งหมด บางส่วนต้องสำรองไว้เป็นกำไรสะสมเพื่อกันไว้ใช้ในเหตุการณ์ที่อาจจำเป็นต้องใช้ในอนาคต

ที่กล่าวมานี้เป็นแค่ข้อบกพร่องที่เห็นได้ชัดในการนำตัวเลขไปใช้คำนวณหา IRR กับ NPV แต่ที่ยากที่สุดในการทำฟีสคือข้อสมมุติฐานต่างๆต้องสมจริงสมจังด้วย พื้นฐานความรู้ของคนที่ทำฟีสไม่ใช่มีแค่พื้นฐานทางบัญชี การเงิน และภาษีอากรเท่านั้น แต่ต้องเข้าใจในธุรกิจที่ทำนั้นเป็นอย่างดีด้วย ต้องสามารถวางแผนว่าจะต้องใช้ทรัพยากรอะไรบ้าง พนักงานกี่คน ต้องซื้ออาคารและวัสดุสำนักงานอะไรอีกบ้างเพื่อที่จะใช้ในการดำเนินธุรกิจที่ลงทุนนั้น ไม่ใช่ว่าอยู่ดีๆเงินจะลอยมาฟรีๆโดยไม่มีใครช่วยทำงานให้เลยใช่ไหม

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

นี่คือสาเหตุที่ผมไม่อยากสอนการทำฟีส แต่หากใครมีฟีสที่ทำไว้แล้วและต้องการปรึกษาเพื่อปรับปรุงให้สมจริงสมจังมากขึ้น ผมก็ยินดีให้คำปรึกษาครับ หรืออยากดูแฟ้มที่ผมเคยสร้างไว้สมัยที่ทำงานในธุรกิจอสังหาริมทรัพย์ เชิญไปที่ลิงก์
https://www.excelexperttraining.com/forum/articles/managing-excel-articles/568-แจกแฟ้มวิเคราะห์โครงการลงทุนในธุรกิจ-real-estate

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

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

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

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

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

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

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

ด้านบริษัทไมโครซอฟท์เองก็ไม่ได้สร้าง Excel ขึ้นมาให้เป็นโปรแกรมที่ทำงานได้สมบูรณ์แบบโปรแกรมสำเร็จรูป พอสร้างแฟ้มเสร็จแล้ว แฟ้มที่สร้างขึ้นด้วยโปรแกรม Excel ยังต้องเปิดด้วยโปรแกรม Excel เท่านั้น เราไม่สามารถใช้ Excel สร้างแฟ้มขึ้นมาแล้วให้แฟ้มนั้นทำงานได้โดยตัวของมันเองโดยปราศจากโปรแกรมที่มีชื่อว่า Microsoft Excel (ถ้าทำได้คงทำให้ยอดขายโปรแกรม Excel เติบโตมากกว่านี้อีกหลายเท่า)

จุดอ่อนที่มีมาตลอดของ Excel อยู่ตรงที่ทุกอย่างที่ทำไว้ในแฟ้มยังสามารถแก้ไขได้อีก ต่อให้ใส่รหัสป้องกันไว้ก็ยังถอดรหัสได้ง่าย ยามแก้ไขเปลี่ยนแปลงอะไรก็ไม่มีระบบติดตามว่าใครเป็นคนแก้ไข แก้ไขเซลล์ใดบ้าง แก้ไขเมื่อไหร่ แก้ไขให้ต่างไปจากเดิมอย่างไร แก้ไขถูกต้องหรือไม่ ดังนั้น Excel จึงเหมาะกับงานที่อยู่ในความรับผิดชอบที่ต้องทำตั้งแต่ต้นจนจบด้วยคนๆเดียวเท่านั้น ไม่เหมาะที่จะแชร์แฟ้มให้ใช้งานร่วมกันแบบทุกคนมีสิทธิ์แก้ไขได้ และไม่เหมาะที่จะนำมาประยุกต์ใช้กับข้อมูลที่มีลักษณะเป็นข้อมูลปฐมภูมิ (Primary Data) เพราะถ้าใช้ Excel เป็นแหล่งผลิตข้อมูลต้นทางแล้วเกิดข้อมูลผิดพลาดขึ้นมา ย่อมส่งผลให้ข้อมูลทุติยภูมิ (Secondary Data) ผิดพลาดตามไปด้วยโดยไม่รู้ตัว

ข้อมูลปฐมภูมิ (Primary Data) เป็นข้อมูลที่ผู้ใช้หรือหน่วยงานที่ใช้เป็นผู้ทำการเก็บข้อมูลด้วยตนเอง ข้อมูลปฐมภูมิเป็นข้อมูลที่มีรายละเอียดตรงตามที่ผู้ใช้ต้องการ แต่มักจะเสียเวลาในการจัดหาและมีค่าใช้จ่ายสูง

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

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

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

image025

จากภาพนี้สมมุติว่าต้องการหายอดรวมของตัวเลขในพื้นที่ตารางจาก B2:F15 ซึ่งตามปกติสามารถใช้สูตร =SUM(B2:F15) ได้อยู่แล้ว เมื่อต้องการเพิ่มลดขนาดตาราง B2:F15 ให้ต่างไปจากเดิมก็ต้องแก้ไขตำแหน่งอ้างอิงในสูตร หรือสั่ง Insert/Delete Row หรือ Column ซึ่งย่อมทำให้ตำแหน่งอ้างอิงในสูตร Sum ปรับตาม แต่ผลจากการ Insert/Delete Row หรือ Column อาจกระทบกับพื้นที่ตารางใกล้เคียงที่อยู่ในแนวเดียวกันและทำให้ต้อง Copy สูตรที่สร้างไว้เดิมมีลำดับเซลล์ที่อ้างอิงไว้ผิดเพี้ยนไปจากที่ควรก็ได้

เริ่มต้นจากใช้สูตรในเซลล์ I2 และ I3 =Cell(“Address”,cell) หาตำแหน่งอ้างอิงของเซลล์หัวมุมซ้ายบนสุด(First)และเซลล์หัวมุมขวาล่างสุด(Last) จะได้ตำแหน่งอ้างอิง $B$2 และ $F$15 ตามลำดับ

นำตำแหน่งอ้างอิงที่ได้มาเชื่อมต่อกันในเซลล์ I4 ด้วยสูตร =FirstCell&":"&LastCell ทำให้ได้ตำแหน่งอ้างอิง $B$2:$F$15 ซึ่งมีลักษณะเป็น Text ที่บอกตำแหน่ง พร้อมที่จะนำไปใช้กับสูตร Indirect

เมื่อต้องการหายอดรวม ให้ใช้สูตรในเซลล์ I6 =SUM(INDIRECT(I4)) หรือจะนำสูตร =INDIRECT($I$4) ไปตั้งชื่อเป็น Formula Name เพื่อเพิ่มความสะดวกในการนำไปใช้ร่วมกับสูตรอื่นใดก็ได้ โดยไม่จำกัดเฉพาะสูตร Sum

หากต้องการปรับเปลี่ยนขนาดตาราง ให้ย้ายเซลล์ First หรือ Last ไปวางลงในตำแหน่งที่ต้องการ

image027

จากภาพนี้เมื่อย้ายเซลล์ First กับ Last ไปวางไว้ที่เซลล์ C5 และ E9 ตามลำดับ จะทำให้สูตร Sum หายอดรวมในขอบเขตตาราง C5:E9 ตามไปด้วย

ประเด็นสำคัญมิได้ขึ้นกับการสั่งย้ายเซลล์ไปตำแหน่งอื่น เพราะการสั่งย้ายเซลล์ย่อมต้องเกิดจากฝีมือของมนุษย์ แต่ขึ้นกับการใช้สูตร =Cell(“Address”,cell) ต่างหาก เพราะสูตรนี้จะคืนค่าเป็นตำแหน่งของเซลล์ที่กำหนดไว้ภายในวงเล็บของสูตร เมื่อใช้สูตร IF, Choose, Index, หรือ Offset ซ้อนเข้าไปก็จะได้ตำแหน่งเซลล์แปรเปลี่ยนตามให้ทันที เช่น

=CELL("Address",INDEX(MyNum,FirstRow))

image029

เมื่อซ้อนสูตร INDEX(MyNum,FirstRow) เข้าไปในสูตร Cell จะเปลี่ยนหน้าที่จากการหาค่าที่ 2 คือเลข 22 จากพื้นที่ตารางชื่อ MyNum มาเป็นการบอกตำแหน่งเซลล์ B3

สูตร VLookup และสูตร Index มีลักษณะการใช้งานเหมือนกันประการหนึ่ง คือ ใช้กับพื้นที่ตารางซึ่งกำหนดขอบเขตไว้ตายตัวอยู่แล้ว แม้จะนำสูตร IF หรือ Choose เข้ามาช่วยก็เป็นเพียงช่วยทำให้สูตร VLookup และสูตร Index สามารถเลือกพื้นที่ตารางจากต่างพื้นที่กันมาใช้งาน แต่จะไม่รับรู้ขอบเขตใหม่หากภายหลังมีการเพิ่มลดจำนวนรายการ

ส่วนการใช้คำสั่ง Table เหมาะสำหรับตารางฐานข้อมูลซึ่งมีลักษณะถูกต้องและจะช่วยขยายตำแหน่งอ้างอิงตามจำนวนรายการ แต่จะไม่ลดขนาดเว้นแต่ว่าผู้ใช้จะสั่ง delete row

สูตร Offset เป็นสูตรที่ช่วยกำหนดขอบเขตตารางให้สามารถเพิ่มลดขนาดตามจำนวนรายการและสามารถนำไปใช้กับตารางทุกประเภท โดยไม่จำกัดว่าจะต้องเป็นตารางฐานข้อมูลเท่านั้น แต่มีข้อจำกัดว่า หากใช้สูตร Offset ดึงข้อมูลข้ามแฟ้มมาใช้ จะต้องเปิดแฟ้มต้นทางขึ้นมาใช้ร่วมกับแฟ้มปลายทางที่ใช้สูตรนี้ด้วยเสมอ

image019

จากภาพนี้เมื่อต้องการขอบเขตตารางตั้งแต่ B3:D7 ให้ใช้สูตร =OFFSET($B$3,0,0,5,3)

  • $B$3 เป็นตำแหน่งเซลล์อ้างอิงเพื่อกำหนดเซลล์อ้างอิงเริ่มต้นของตาราง
  • เลข 0 ตัวแรกในสูตร เป็นตำแหน่งจำนวน row ถัดไป สาเหตุที่ใช้เลข 0 เพื่อชี้ว่าจุดเริ่มต้นของตารางยังคงอยู่ใน row เดียวกันกับเซลล์อ้างอิงเริ่มต้นของตาราง $B$3
  • เลข 0 ตัวที่สองในสูตร เป็นตำแหน่งจำนวน column ถัดไป สาเหตุที่ใช้เลข 0 เพื่อชี้ว่าจุดเริ่มต้นของตารางยังคงอยู่ใน column เดียวกันกับเซลล์อ้างอิงเริ่มต้นของตาราง $B$3
  • เลข 5 เป็นส่วนของความสูงของตาราง ในที่นี้แสดงว่ามีความสูง 5 row
  • เลข 3 เป็นส่วนของความกว้างของตาราง ในที่นี้แสดงว่ามีความกว้าง 3 column

หากต้องการให้สูตรนี้ปรับขนาดแบบยืดหยุ่น (Dynamic Range) โดยทั่วไปเฉพาะส่วนของความสูงของตารางเท่านั้นที่จะเพิ่มลดตามจำนวนรายการที่บันทึกไว้ เมื่อต้องการทำให้สูตร Offset ปรับขนาดความสูงตาม สามารถหาความสูงได้หลายวิธี ดังนี้

  1. สูตร CountA($B:$B)-1 เพื่อนับจำนวนเซลล์ใน column B ที่มีข้อมูลแล้วลบทิ้งเสีย 1 เพราะไม่ต้องการนับรวมหัวตารางเซลล์ B2 ซึ่งมีคำว่า Id
  2. ใช้สูตร CountA($B$3:$B$10000) เพื่อนับจำนวนเซลล์ที่มีข้อมูลตั้งแต่รายการแรกลงมา อาจเผื่อขนาดไว้ถึง row 10000

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

หากเป็นตารางซึ่งมีช่องว่างแทรกไว้ไม่แน่นอน สามารถคำนวณหาความสูงของตารางได้ โดยใช้สูตร Array {=MAX(IF(B:D<>0,ROW(B:D)))-MIN(IF(B:D<>0,ROW(B:D)))}

  • สูตร Array { =MAX(IF(B:D<>0,ROW(B:D)))} หาเลขที่ row สุดท้ายของตาราง
  • สูตร Array { =MIN(IF(B:D<>0,ROW(B:D)))} หาเลขที่ row แรกของตาราง

หมายเหตุ สูตร Array มีวงเล็บปีกกาปิดหัวท้ายสูตร เกิดจากการกดปุ่ม Ctrl+Shift+Enter พร้อมกันแทนการกดปุ่ม Enter และอาจต้องปรับเพิ่มลดตัวเลขให้เท่ากับความสูงที่แท้จริงหากตารางในช่วง column B:D มีข้อมูลอื่นซึ่งไม่เกี่ยวข้องบันทึกอยู่

เมื่อหาความสูงของตารางด้วยสูตรได้แล้ว จากเดิมที่เป็นสูตร =OFFSET($B$3,0,0,5,3) ให้นำสูตรคำนวณหาความสูงมาซ้อนกันกลายเป็นสูตร
=OFFSET($B$3,0,0, CountA($B:$B)-1, 3)

หรือจะลิงค์เฉพาะผลลัพธ์ของความสูงที่คำนวณได้มาใช้ก็ได้ กลายเป็นสูตร
=OFFSET($B$3,0,0, เซลล์หาความสูง, 3)

สูตร Offset ที่ทำหน้าที่เป็น Dynamic Range นี้ หากสร้างลงไปในเซลล์เดียวจะเกิด error #VALUE! เสมอ เนื่องจากสูตรนี้หาค่าหลายค่ามาให้จึงไม่สามารถแสดงครบทุกค่าในเซลล์ใดเซลล์หนึ่งได้ หากต้องการตรวจสอบว่าสูตรทำงานได้ถูกต้องหรือไม่ ให้กดปุ่ม F2 ตามด้วย F9 จะพบว่าสูตรคืนค่าเป็นค่าทั้งหมดในตารางนั้นออกมาให้เห็นแบบ Array

={"a001","a",10;"a002","b",20;"a003","c",30;"a004","d",40;"a005","e",50}

เมื่อเห็นค่าที่แท้จริงของสูตรแล้ว ให้กดปุ่ม Esc เพื่อแก้กลับคืนเป็นสูตรตามเดิม

อีกวิธีหนึ่งในการตรวจสอบสูตร ให้คลิกลงไปในช่อง Formula Bar ลากเลือกสูตรทั้งหมด =OFFSET($B$3,0,0, CountA($B:$B)-1, 3) แล้วกดปุ่ม F5 แล้วกดปุ่ม Enter เพียงครั้งเดียว จะพบว่า Excel เปลี่ยนสูตร Offset เป็นตำแหน่งอ้างอิง =B3:D7 พร้อมกับแสดงตำแหน่งในตารางให้เห็น จากนั้นให้กดปุ่ม Esc เพื่อแก้กลับคืนเป็นสูตรตามเดิม

เมื่อพบว่าสูตร Offset แสดงค่าหรือชี้ตำแหน่งได้ถูกต้อง ให้ตรวจสอบตำแหน่งอ้างอิงทุกตำแหน่งในสูตรว่าเป็น Absolute Reference เช่น $B$3 และ $B:$B ก่อน จากนั้นจึงนำสูตรนี้ไปตั้งชื่อให้เป็น Formula Name โดยใช้คำสั่ง Formulas > Define Name ต่อมาเมื่อต้องการสร้างสูตร VLookup, Match, หรือ Index ให้นำชื่อ Formula Name ที่ตั้งขึ้นนี้ไปใช้แบบเดียวกับการใช้ชื่อ Range Name โดยทั่วไป

ถ้าต้องการปรับสูตร Offset ให้คืนค่าเป็นพื้นที่ตารางเพียงบางส่วน ให้ปรับส่วนของตำแหน่ง row, column, ความสูง และความกว้างในสูตร เช่น

image021

  • =OFFSET($B$3,2,0) หมายถึง B5
  • =OFFSET($B$3,4,2) หมายถึง D7
  • =OFFSET($B$3,2,0,1,3) หมายถึง B5:D5
  • =OFFSET($B$3,4,0,1,3) หมายถึง B7:D7
  • =OFFSET($B$3,2,0,2,3) หมายถึง B5:D6
  • =OFFSET($B$3,0,0, CountA($B:$B)-1, 1) หมายถึง B3:B7
  • =OFFSET($B$3,0,1, CountA($B:$B)-1, 1) หมายถึง C3:C7
  • =OFFSET($B$3,0,2, CountA($B:$B)-1, 1) หมายถึง D3:D7
  • =OFFSET($B$3,0,0, CountA($B:$B)-1, 2) หมายถึง B3:C7
  • =OFFSET($B$3,0,1, CountA($B:$B)-1, 2) หมายถึง C3:D7
  • =OFFSET($B$3, CountA($B:$B)-2,0,1,3) หมายถึง B7:D7 หรือรายการสุดท้าย

นอกจากนี้ ผู้ใช้สูตร Offset สามารถกำหนดตำแหน่งเซลล์อ้างอิงเซลล์แรกไว้ที่เซลล์ใดก็ได้ (ไม่จำเป็นต้องใช้เซลล์ B3 ซึ่งเป็นเซลล์แรกของรายการแรก) และยังสามารถใช้หาค่าในทุกทิศทาง เพียงกำหนดจำนวน row ถัดไปหรือเลข column ถัดไปให้เป็นค่าลบ

image023

สูตร Index เป็นสูตรทำหน้าที่ดึงค่าออกมาจากตารางที่กำหนดตามตำแหน่ง row และ column ที่ต้องการ เช่น ตามภาพตัวอย่างต่อไปนี้ =Index(Class1,3,2) จะดึงชื่อ c ออกมาให้เพราะอยู่ในตำแหน่ง row ที่ 3 ตัดกับ column ที่ 2 ภายในพื้นที่ตารางชื่อ Class1 หรือถ้าไม่ต้องการกำหนดตำแหน่ง row หรือ col ก็ให้กำหนดเลขตำแหน่งรายการที่ต้องการแทนเพียงค่าเดียว เช่น =Index(CustId1,3) จะดึงรหัส a003 ออกมาเพราะรหัสนี้มีตำแหน่งเป็นลำดับที่ 3 ในตารางชื่อ CustId1 (ทั้งนี้ CustId1 มีลักษณะเป็น Single Column จากเซลล์ B3:B7)

image017

สูตร Index ยังมีโครงสร้างสูตรแบบพิเศษ ซึ่งช่วยเลือกตำแหน่งตารางที่ต้องการได้ทันทีโดยไม่จำเป็นต้องอาศัยสูตร If หรือ Choose เข้ามาช่วย เช่น

สูตรในเซลล์ C11 ใช้หาชื่อลูกค้า g ตามรหัส b002 ที่พิมพ์ลงไปในเซลล์ B11
=INDEX(  (Class1,Class2,Class3),  TrNum, 2, Class)

  • ในสูตรนี้ พื้นที่ตารางส่วนของ (Class1,Class2,Class3) เป็น 3 ตารางที่ต้องการเลือก
  • TrNum เป็นเลขที่ตำแหน่งรายการของรหัส b002 ที่พิมพ์ไว้ในเซลล์ B11 มาจากสูตร
    =MATCH(B11, CHOOSE(Class, CustId1,CustId2,CustId3), 0)
  • เลข 2 คือ เลขชี้ตำแหน่ง column ของชื่อลูกค้า
  • Class เป็นเลขที่ตารางซึ่งหามาจาก ClassTable ด้วยสูตร
    =VLOOKUP(B11, ClassTable, 2)
  • CHOOSE(Class, CustId1,CustId2,CustId3) ทำหน้าที่เลือกตำแหน่งตารางรหัสลูกค้าตามเลขที่ของ Class

นอกจากนี้ถ้าสร้างสูตร Index แบบ Array จะทำหน้าที่หาตำแหน่งตารางทั้งหมดตามแนวนอนหรือแนวตั้งได้อีกด้วยโดยกำหนดเลขที่ row หรือ column ให้เท่ากับ 0 เช่น

=Index(Class1, 0, 3)
จะได้ค่าทุก row ของ column ที่ 3 คือ ยอด Amount ={10;20;30;40;50}

หรือ

=Index(Class1, 3, 0)
จะได้ค่าทุก column ของ row ที่ 3 คือ รหัส a003 ={"a003","c",30}

ตามปกติในสูตร VLookup, Match, Offset, หรือสูตรด้านฐานข้อมูลใดๆ สามารถรับตำแหน่งตารางได้เพียงตารางเดียวในวงเล็บของสูตร เช่น สูตร =VLOOKUP($H$3,MyData,2,0) ใช้ Range Name ชื่อ MyData เป็นตำแหน่งตารางฐานข้อมูลที่ต้องการค้นหาคำตอบ ถ้าต้องการทำให้สูตร VLookup หรือสูตรฐานข้อมูลสูตรใดๆสูตรเดียวสามารถค้นหาข้อมูลจากหลากหลายตาราง ให้ใช้สูตร IF หรือ Choose ซ้อนเข้าไปในส่วนของ MyData

สมมติว่า มีตารางฐานข้อมูลของลูกค้าหลายๆกลุ่มตามเกรดของลูกค้า ซึ่งลักษณะของตารางฐานข้อมูลของแต่ละกลุ่มมีหน้าตาตารางเหมือนๆกัน เพียงแต่จัดเก็บแยกตารางไว้ต่างพื้นที่ (หรือต่างชีทกัน) แล้วตั้งชื่อตารางว่า ClassA, ClassB, และ ClassC

image011

เมื่อต้องการค้นหาข้อมูล ให้พิมพ์ชื่อ Class A, B, หรือ C ลงไปในเซลล์ B10 ซึ่งตั้งชื่อว่า Class แล้วพิมพ์รหัสลูกค้าลงไปในเซลล์ B14 จะสามารถค้นหาข้อมูลของ Name และ Amount โดยใช้สูตร IF(Class="A", ClassA, IF(Class="B", ClassB, ClassC) ) ซ้อนลงไปในสูตร VLookup เพื่อทำให้สามารถเลือกได้ว่าจะหาข้อมูลจากตารางใดตามเงื่อนไขชื่อ Class กลายเป็นสูตรดังนี้

ในเซลล์ C14
=VLOOKUP(  $B$14,  IF(Class="A", ClassA, IF(Class="B", ClassB, ClassC) ),  2,  0)

ในเซลล์ D14
=VLOOKUP(  $B$14,  IF(Class="A", ClassA, IF(Class="B", ClassB, ClassC) ),  3,  0)

หากไม่ต้องการเสียเวลาพิมพ์ชื่อ Class เพื่อเพิ่มความสะดวกให้ใช้รหัสในเซลล์ B14 เลือกค้นหาข้อมูลได้ทันที ให้ใช้สูตร =Left(C14) สร้างลงไปในเซลล์ B10 ซึ่งตั้งชื่อว่า Class เพื่อดึงตัวอักษรที่อยู่ซ้ายสุดของรหัสมาใช้เป็นชื่อ Class ดังนั้นการตั้งชื่อรหัสให้มีความหมายจะทำให้เกิดประโยชน์ช่วยลัดขั้นตอนในการใช้งานอย่างมาก

การใช้สูตร IF เพื่อเลือกพื้นที่ตารางหลายๆแห่งมาใช้ จะกลายเป็นสูตร IF ซ้อนกัน ทำให้สร้างขึ้นมาได้ยากและกลายเป็นสูตรยาวขึ้นเรื่อยๆ จึงแนะนำให้ให้ใช้สูตร Choose แทน IF แต่ต้องใช้ตัวเลขที่ตาราง 1, 2, หรือ 3 มาใช้เป็นเงื่อนไขแทนชื่อตาราง A, B, หรือ C

image013

เมื่อต้องการค้นหาข้อมูล ให้พิมพ์เลขที่ Class 1, 2, หรือ 3 ลงไปในเซลล์ B10 ซึ่งตั้งชื่อว่า Class แล้วพิมพ์รหัสลูกค้าลงไปในเซลล์ B14 จะสามารถค้นหาข้อมูลของ Name และ Amount โดยใช้สูตร CHOOSE(Class,Class1,Class2,Class3) ซ้อนลงไปในสูตร VLookup เพื่อทำให้สามารถเลือกได้ว่าจะหาข้อมูลจากตารางใดตามเงื่อนไขเลขที่ Class กลายเป็นสูตรดังนี้

ในเซลล์ C14
=VLOOKUP(  $B$14,  CHOOSE(Class,Class1,Class2,Class3),  2,  0)

ในเซลล์ D14
=VLOOKUP(  $B$14,  CHOOSE(Class,Class1,Class2,Class3),  3,  0)

หากไม่ต้องการเสียเวลาพิมพ์เลขที่ Class เพื่อเพิ่มความสะดวกให้ใช้รหัสในเซลล์ B14 เลือกค้นหาข้อมูลได้ทันที ต้องสร้างตารางสรุปความสัมพันธ์ระหว่างรหัสกับเลขที่ Class ขึ้นมาใช้งาน ตามภาพต่อไปนี้คือเซลล์ F10:G12 โดยตั้งชื่อว่า ClassTable ซึ่งมี column ซ้ายสุดเรียงลำดับเลขรหัส Id เฉพาะรหัสตัวแรกของแต่ละกลุ่ม แล้วให้ใช้สูตร VLookup แบบ Approaching Match =VLOOKUP(B14,ClassTable,2) สร้างลงไปในเซลล์ B10 ซึ่งมีชื่อว่า Class

image015

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

ใน Excel 2003 และรุ่นก่อนนั้น มีคำสั่ง Data > List ไว้ใช้ช่วยแก้ปัญหาดังกล่าว ส่วนใน Excel  2010 เป็นต้นมาได้ตั้งชื่อคำสั่งใหม่เป็น Table (เป็นคำสั่งที่ต่างจาก Data Table) โดยสั่ง Insert > Table หรือ Home > Format as Table ทำให้ Excel ปรับขอบเขตตารางตามปริมาณข้อมูลที่เพิ่มให้โดยอัตโนมัติ ช่วยทำให้ตำแหน่งอ้างอิงที่กำหนดไว้ในสูตร, Format, Conditional Formatting, Data Validation, หรือแม้แต่ใน Pivot Table ปรับขนาดตามให้ทันที

image007

ก่อนที่จะใช้คำสั่ง Table ควรตั้งชื่อ Range Name ให้กับตารางฐานข้อมูลทางด้านซ้ายมือของภาพนี้ไว้ก่อน โปรดสังเกตว่า Range Name แต่ละชื่อต้องมีขนาดอย่างน้อย 2 เซลล์ขึ้นไป (ตามภาพนี้คือ MyData, Id, Name, Amount และสาเหตุที่ไม่ตั้งชื่อให้กับเซลล์ของ Cost เพื่อพิสูจน์ว่าไม่จำเป็นต้องตั้งชื่อไว้ก่อนก็ยังได้) จึงจะทำให้ Table ขยายขอบเขตของชื่อตารางตามปริมาณข้อมูลที่เพิ่มขึ้น

เมื่อตั้งชื่อ Range Name ไว้ก่อนเรียบร้อยแล้ว ให้คลิกลงไปในตารางฐานข้อมูลแล้วสั่ง Insert > Table โดย Excel จะเลือก =$B$2:$E$3 เป็นขอบเขตตารางให้เองพร้อมกับกาช่อง My table has headers ไว้ด้วยแล้ว เมื่อกดปุ่ม OK จะเกิด Range Name ชื่อ Table2 มีตำแหน่งอ้างอิง =$B$3:$E$3 สร้างขึ้นโดยอัตโนมัติ (ชื่อ Table2 นี้ จะมีเลขต่อท้ายเพิ่มขึ้นทีละ 1 ตามจำนวนครั้งที่ใช้คำสั่ง Table)

เมื่อบันทึกข้อมูลเพิ่มขึ้น จะพบว่าชื่อ Range Name ทั้งหมดมีขอบเขตของตำแหน่งอ้างอิงขยายตามให้อย่างอัตโนมัติ ช่วยทำให้ตำแหน่งอ้างอิงที่กำหนดไว้ในสูตร, Format, Conditional Formatting, Data Validation, หรือแม้แต่ใน Pivot Table ปรับขนาดตามให้ทันที

image009

แม้คำสั่ง Table จะมีประโยชน์อย่างมาก แต่ก็เหมาะกับตารางเก็บข้อมูลซึ่งบันทึกไว้เป็นฐานข้อมูลที่ดีเท่านั้น และผู้ใช้งานควรทราบเพิ่มเติมอีกว่า คำสั่งนี้จะทำให้เกิดตำแหน่งอ้างอิงแบบพิเศษที่เรียกว่า Structured Reference มาใช้แทนตำแหน่งอ้างอิงแบบปกติ เช่น =SUM(Table2[Cost]) จะคืนค่าเป็นยอดรวมของ Cost หาต่อมามีการสั่งยกเลิก Table จะทำให้สูตรที่เคยใช้ Structured Reference แก้กลับมาใช้ตำแหน่งอ้างอิงตามปกติให้เอง ทำให้สูตร =SUM(Table2[Cost]) แก้กลับมาเป็น =SUM(Sheet1!$E$3:$E$7)

การยกเลิก Table ทำได้ง่ายๆโดยคลิกขวาลงไปในตารางที่เป็น Table แล้วสั่ง Table > Convert to range แต่ถ้าเปลี่ยนใจสั่ง Insert > Table ขึ้นมาใหม่ จะพบว่าสูตร =SUM(Sheet1!$E$3:$E$7) ไม่เปลี่ยนกลับไปเป็น =SUM(Table2[Cost]) แต่อย่างใด ดังนั้นจึงขอแนะนำให้ใช้ Range Name ที่ตั้งชื่อขึ้นมาเองไว้ก่อน จะยืดหยุ่นและถาวรกว่าการใช้ Structured Reference

นอกจากนี้โปรดสังเกตว่า ในตัวอย่างนี้ก่อนการใช้คำสั่ง Table มีข้อมูลบันทึกไว้เพียงรายการเดียว จึงจำเป็นต้องตั้งชื่อ Range Name ชื่อ Id, Name, และ Amount ให้กับเซลล์ B3:B4, C3:C4, และ D3:D4 ซึ่งเผื่อไว้ถึง row 4 ที่เป็นเซลล์ว่าง ทำให้สูตรที่ใช้ตำแหน่งอ้างอิงรวมถึงเซลล์ว่างนี้อาจทำงานผิดพลาดก็ได้ ดังนั้นเพื่อป้องกันปัญหานี้ ควรใช้คำสั่ง Table กับตารางที่บันทึกข้อมูลไว้ตั้งแต่ 2 รายการขึ้นไป และตั้งชื่อ Range Name ให้กำหนดขอบเขตไว้เท่ากับปริมาณข้อมูลที่มีจริงโดยไม่ต้องเผื่อเซลล์ว่างไว้ด้วย

อย่างไรก็ตามหากมีการลบเฉพาะตัวข้อมูลทิ้งโดยไม่ได้สั่ง Delete Row จะพบว่าขอบเขตตารางยังคงมีขนาดคงเดิม ทั้ง Range Name และตำแหน่งอ้างอิงที่ใช้ในสูตร ไม่ได้ลดขนาดตามจำนวนรายการที่ลดลงแต่อย่างใด จึงเป็นข้อแม้สำคัญของการใช้ Table ว่าจะช่วยขยายขอบเขตตารางตามปริมาณข้อมูลที่เพิ่มโดยอัตโนมัติ แต่ไม่ได้ลดขนาดตามปริมาณข้อมูลที่ลดลง

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

ตัวอย่าง

image001

ตัวอย่างนี้เป็นตารางสูตรคูณซึ่งนำตัวเลข 2, 3, 4, 5 บนหัวตารางมาคูณกับตัวเลข 10, 20, 30 ด้านข้างซ้ายของตาราง โดยใช้วิธีตั้งชื่อเซลล์ C2:F2 บนหัวตารางว่า Top และตั้งชื่อเซลล์ B3:B5 ด้านซ้ายของตารางว่า Left

ในเซลล์ C3 สร้างสูตร =Top*Left แล้วเมื่อ copy เซลล์ C3 ไป paste ลงไปในเซลล์ตั้งแต่ C3:G7 ย่อมพบว่าสูตร =Top*Left สามารถคำนวณหาผลคูณได้ถูกต้องเฉพาะพื้นที่ C3:F5 ซึ่งเป็นตารางที่อยู่ในขอบเขตแนวคู่ขนานตัดกันของ Top และ Left เท่านั้น ส่วนสูตรในเซลล์นอกแนวคู่ขนานของ Top กับ Left ให้คำตอบเป็น error ว่า #VALUE!

แทนที่จะดัดแปลง Top กับ Left ให้เป็น Dynamic Range ด้วยสูตร Offset เพื่อทำให้ Top กับ Left ขยายขอบเขตให้มีขนาดตามค่าตัวเลขบนหัวตารางและตัวเลขข้างซ้ายของตารางที่อาจจะมีเพิ่มขึ้น ให้ดัดแปลงตำแหน่งอ้างอิงของ Top กับ Left ให้เป็น Dynamic Cell โดยมีขั้นตอนดังนี้

  1. คลิกเลือกเซลล์ C3
  2. เลือกคำสั่ง Formulas > Name Manger
  3. แก้ตำแหน่งอ้างอิงของ Top =C$2 และ Left =$B3

image003

เมื่อ Top =C$2 จะทำให้ Excel ถือว่าทุกเซลล์ที่อยู่ใน row 2 มีชื่อว่า Top และเมื่อ Left =$B3 ย่อมหมายถึงทุกเซลล์ใน column B มีชื่อว่า Left ทำให้สามารถใช้สูตร Top*Left ได้ทุกที่ในชีทโดยไม่จำเป็นต้องกำหนดขอบเขตตารางของ Top กับ Left ตามขนาดข้อมูลอีกต่อไป

หากต้องการย้ายตารางสูตรคูณนี้ไปยัง row อื่น ไม่สามารถใช้วิธี Cut เฉพาะพื้นที่ตารางสูตรคูณ B2:G7 แต่ต้องเลือก Cut row 2:7 ไปวางที่ row อื่น หรือใช้วิธี Insert row เพื่อขยับตำแหน่งอ้างอิงของ Top ทั้งแนว row ที่ 2 ไปพร้อมกัน เพราะ Top มิได้หมายถึงแค่พื้นที่บางส่วนของ หากครอบคลุมพื้นที่ทั้ง row ที่ 2 ทั้งหมด

ตัวอย่าง

ในกรณีที่ต้องการเปลี่ยนสี column ในตารางสูตรคูณให้มีสีเฉพาะแนวของ column ที่อยู่ใต้ตัวเลขบนหัวตารางที่เป็นเลขคี่

image005

ให้เลือกพื้นที่ตัวเลขผลคูณตั้งแต่ C3:G7 แล้วใช้คำสั่ง Home > Conditional Formatting แบบ Use a formula to determine which cells to format แล้วใช้สูตรต่อไปนี้

=MOD(C$2,2)=1

ขอให้สังเกตตำแหน่งเซลล์ C$2 ในสูตรนี้ว่าเป็นเซลล์แรกบนหัวตารางด้านบนซึ่งอยู่ในแนวคู่ขนานกับพื้นที่ C3:G7 ที่เลือกไว้ และต้องกำหนดให้ใส่เครื่องหมาย $ ไว้หน้าเลข 2 แต่ไม่ได้ใส่ $ หน้าตัว C เพื่อควบคุมให้ Excel นำตำแหน่งเซลล์ถัดไปใน row ที่ 2 มาใช้ในการคำนวณ ซึ่งได้แก่เซลล์ C2, D2, E2, F2, และ G2 นั่นคือตัวเลข 2, 3, 4, 5, 6 ตามลำดับ ซึ่งเมื่อนำมาหารด้วยเลข 2 แล้ว หากเหลือเศษเท่ากับ 1 ย่อมแสดงว่าเลขในเซลล์บนหัวตารางด้านบนเซลล์นั้นเป็นเลขคี่ ทำให้ Conditional Formatting เปลี่ยนสีเซลล์ผลคูณที่อยู่ใต้เลข 3 และ 5 ซึ่งเป็นเลขคี่

ประโยชน์ของวิธีทำให้เซลล์ C$2 เป็น Dynamic Cell จะช่วยทำให้ใช้คำสั่ง Conditional Formatting กำหนดเงื่อนไขให้กับทั้งตารางได้พร้อมกันในทีเดียว โดยไม่จำเป็นต้องเสียเวลาใช้คำสั่งนี้กับทีละเซลล์หรือทีละ column และยังสามารถนำหลักการนี้ไปใช้กับคำสั่ง Data Validation ที่กำหนด Allow แบบ Custom โดยใช้สูตรตรวจสอบการบันทึกค่าได้เช่นกัน

งานที่สร้างขึ้นด้วย Excel ไม่ได้ใช้ตำแหน่งอ้างอิง (Reference) เพื่อใช้ในสูตรคำนวณแต่เพียงอย่างเดียว ตำแหน่งอ้างอิงยังถูกเรียกใช้ในคำสั่ง Conditional Formatting, Data Validation, Advanced Filter, Pivot Table, หรือในคำสั่งอื่นๆ แม้แต่ในรหัส Visual Basic for Applications (VBA) ซึ่งโดยทั่วไปเมื่อมีการ Insert หรือ Delete row หรือ column หรือโยกย้ายตำแหน่งตาราง จะส่งผลให้ตำแหน่งอ้างอิงที่ใช้เดิมปรับเปลี่ยนขนาดตามทันที และหากรู้จักใช้ชื่อในการกำหนดตำแหน่งอ้างอิงจะช่วยทำให้กำหนดตำแหน่งอ้างอิงในสูตรได้ง่าย และยังทำให้ตำแหน่งอ้างอิงที่ใช้ในกราฟหรือ VBA ปรับขนาดตามได้อีกด้วย ช่วยทำให้ไม่ต้องเสียเวลาสร้างกราฟใหม่หรือต้องย้อนกลับมาแก้ไขรหัส VBA อีกแม้แต่น้อย

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

=VLookup( IDCode, A:D, 3)

ซึ่งการกำหนดตำแหน่งอ้างอิง A:D เช่นนี้จะทำให้สูตรทำงานช้าลงอย่างมากและยังทำให้แฟ้มมีขนาดใหญ่ขึ้นโดยไม่จำเป็นอีกด้วย

ในบทความนี้ขอแนะนำวิธีกำหนดขอบเขตตารางแบบยืดหยุ่น ตั้งแต่วิธี Dynamic Cell ไปจนถึงวิธี Dynamic Range ซึ่งใช้สูตร Offset, Index, Indirect, Address ช่วยในการกำหนดขอบเขตตารางแบบอัตโนมัติ

การจัดเตรียมทั่วไป

  1. ปรับให้ใช้งานแฟ้มที่มีรหัส VBA ได้ โดยสั่ง File > Excel Options > Trust Center > Trust Center Settings > Macro Settings > กาช่อง Disable all macro with notifications (เป็น Default ของ Excel 2007/2010)
  2. ตอนเปิดแฟ้มจะมีคำถามขึ้นมาบนหน้าจอ ให้เลือก Enable Macros (ถ้าไม่ไว้ใจแฟ้มนั้น ให้เลือก Disable Macros)
  3. Excel 2007/2010 สามารถกำหนด Trust Locations เพื่อระบุชื่อ Folder ที่เก็บแฟ้มที่ต้องการให้ Enable Macro เองทันทีเมื่อเปิดแฟ้ม
  4. Excel 2010 สามารถกำหนด Trust Document เพื่อสั่งให้ Excel จดจำว่าแฟ้มที่เคยเปิดนั้นถูกสั่งให้ใช้ Macro อย่างไร
  5. อย่าลืม Save แฟ้มที่มีรหัส VBA เป็นนามสกุล xlsm

การเตรียมพร้อมสำหรับใช้ VBA

Excel 2007 สั่ง Office Button > Excel Options > Popular > กาช่อง Show Developer tab in the Ribbon

Excel 2010 สั่ง File > Options > Customize Ribbon > กา Developer ที่แสดงในรายชื่อในจอด้านขวา

การปรับระบบแสดงผลภาษาไทยใน Visual Basic Editor (VBE)

ให้กดปุ่ม ALT+F11 เพื่อเปิด VBE ขึ้นมา แล้วสั่ง Tools > Options > Editor Format แล้วเลือก Font ภาษาไทย

Calculation

Application.Calculation = xlManual
ปรับระบบการคำนวณเป็น Manual เพื่อหยุดการคำนวณชั่วคราว

Application.Calculation = xlAutomatic
ปรับระบบการคำนวณเป็น Automatic

Activesheet.Calculate
สั่งคำนวณเฉพาะชีทที่กำลังใช้งานอยู่

CutCopyMode

Application.CutCopyMode=False
ล้างหน่วยความจำใน clipboard เพื่อลดภาระของเครื่อง

GoTo

Application.Goto Reference:=Range("V300")
หรือ
Range("V300").Select
หรือ
Application.Goto Reference:=Range("V300"), Scroll=True
เพื่อทำให้เซลล์ที่ถูกเลือกเป็นเซลล์แรกซ้ายบนสุดของจอ

Quit : ปิดโปรแกรม Excel

Application.Quit

ScreenUpdating

Application.ScreenUpdating = False
Application.ScreenUpdating = True
ควบคุมไม่ให้รหัสที่อยู่ระหว่างคำสั่ง 2 บรรทัดนี้ แสดงการเปลี่ยนแปลงใดๆให้เห็นบนหน้าจอ

Workbook

Workbooks.Open "suchAndSuch.xls"
เปิดแฟ้มชื่อ suchAndSuch.xls

Workbooks.Open Sheets("sheet1").Range("A1").Value
เปิดแฟ้มที่มีชื่อตามที่บันทึกชื่อไว้ในเซลล์ A1 ของ Sheet1

ThisWorkbook.Close
ปิดแฟ้มที่เก็บรหัสที่ทำงานนี้

ThisWorkbook.Saved = True
ThisWorkbook.Close
ปิดแฟ้มที่เก็บรหัสที่ทำงานนี้โดยไม่ต้อง save

ActiveWorkbook.Close
ปิดแฟ้มที่กำลังใช้งานนี้

ActiveWorkbook.Saved = True
ActiveWorkbook.Close
ปิดแฟ้มที่กำลังใช้งานนี้โดยไม่ต้อง save

Workbooks("Book1.xls").Close
ปิดแฟ้มชื่อ Book1.xls

Workbooks(Range("A1").Value).Close
ปิดแฟ้มชื่อตามที่ระบุไว้ในเซลล์ A1

ActiveWorkbook.Save
save แฟ้มที่กำลังใช้งาน

Workbooks("Book1.xls").Save
save แฟ้มชื่อ Book1.xls

Workbooks(Range("A1").Value).Save
save แฟ้มที่มีชื่อตามที่ระบุไว้ในเซลล์ A1

ActiveWorkbook.SaveAs "C:/suchAndSuch.xls"
save แฟ้มที่กำลังใช้งานตามชื่อและสถานที่เก็บตามต้องการ

Workbooks("Book1.xls").SaveAs "C:/suchAndSuch.xls"
save แฟ้มชื่อ Book1.xls ตามชื่อและสถานที่เก็บตามต้องการ

Kill "C:\myFile.xls"
ลบแฟ้มชื่อ myfile.xls ที่เก็บอยู่ใน Drive C

Worksheet

Sheets("Sheet1").Visible= xlVeryHidden
hide ชีทแรกแบบพิเศษ เพื่อทำให้หาจากเมนู Format > Sheet ไม่พบ

Sheets(Array("Sheet1", "Sheet2")).Select
เลือกชีทหลายชีทตามชื่อที่กำหนดพร้อมกัน

ActiveWindow.SelectedSheets.Visible = False
ซ่อนชีทที่เลือกไว้ทั้งหมดพร้อมกัน

Sheets("Balance").Delete
ลบชีทชื่อ Balance

Sheets.Add
insert ชีท 1 ชีท

Sheets.Add before:=Sheets("Balance")
insert ชีท 1 ชีท ไว้ก่อนชีทชื่อ Balance

Sheets.Add after:=Sheets(1)
insert ชีท 1 ชีท ไว้หลังชีทแรก

Sheets.Add After:=Sheets(Sheets.Count)
insert ชีท 1 ชีท ไว้หลังชีทสุดท้าย

Cell และ Range

Cells.Select
เลือกทุกเซลล์ในตาราง

Selection.CurrentRegion.Select
เลือกพื้นที่ตารางที่ติดต่อกันกับเซลล์ที่เลือกอยู่

Activecell.Row
Activecell.Column
คืนค่าเป็นเลขที่ของ row/column ของเซลล์ที่ใช้งานอยู่

Selection.Rows.Count
Selection.Columns.Count
คืนค่าเป็นจำนวน row/column ของตารางที่เลือก

Selection.CurrentRegion.Rows.Count
คืนค่าเป็นจำนวน row ของพื้นที่ตารางที่ติดต่อกันกับเซลล์ที่เลือกอยู่

Range("A1:A8").Formula = "=C8+C9"
สร้างสูตร =C8+C9, =C9+C10 และต่อไป ลงไปในเซลล์ A1:A8

Range("A1:A8").Formula = "=$C$8+$C$9"
สร้างสูตร =$C$8+$C$9 ลงไปในทุกเซลล์ของ A1:A8

Range("A8:G8").Select
เลือกพื้นที่ตาราง A8:G8 โดย A8 เป็นเซลล์เดียวที่ active

 

  1. copy แฟ้ม Add-in ที่ต้องการไปเก็บไว้ใน folder ใดก็ได้
  2. เปิด Excel แล้วสั่ง Developer > Add-ins > Browse หาแฟ้ม xla ที่เก็บไว้ จะพบว่ามีชื่อ Add-in ที่ต้องการถูกกาเครื่องหมายถูกไว้
  3. เปิดแฟ้มที่มีสูตร Add-in สร้างไว้ จะพบว่าสูตรทำงานตามต้องการ (แต่ถ้าเปิดแฟ้มไว้ก่อนที่จะ Browse ในข้อ 2 จะพบว่าสูตร error ต้องเข้าไปกด F2 ที่เซลล์สูตรแล้วกด Enter เพื่อกระตุ้นให้สูตรทำงาน)

ถ้าในแฟ้ม ไม่ได้ใช้สูตร Add-in ควรเลิกใช้ Add-in เพื่อทำให้ไม่เปลืองหน่วยความจำ โดยสั่ง Developer > Add-ins > ตัดกาเครื่องหมายถูกทิ้ง ต่อเมื่อต้องการใช้ Add-in จึงกลับมากาถูกด้านหน้าเฉพาะ Add-in ที่ต้องการใช้งาน

ถ้าจำโครงสร้างสูตรไม่ได้ ให้ดูได้จาก Insert Function แล้วเลือกสูตรแบบ User defined พอคลิกชื่อสูตรจะพบคำอธิบายแสดงไว้ด้านล่างสุด

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

ถ้าต้องการย่อสูตรยากๆยาวๆให้สั้นลง โดยหาทางใช้ VBA สร้างสูตรขึ้นมาใช้ จะมีแนวทางการใช้สูตรที่สร้างด้วย VBA (Function VBA หรือ User Defined Function - UDF) 2 แบบ คือ

  1. สร้างสูตรเพื่อใช้กับแฟ้มใดแฟ้มหนึ่งโดยเฉพาะ
  2. สร้างสูตรเพื่อใช้กับแฟ้มใดก็ได้ (Add-in)

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

Function VBA มิได้สร้างใน Sub Procedure แต่ให้สร้างไว้ใน Function Procedure ซึ่งมีโครงสร้างของชุดคำสั่งที่เป็นสูตร ดังนี้

Function ชื่อสูตร(ชื่อตัวแปร1,ชื่อตัวแปร2,,,,ชื่อตัวแปรn)
    รหัสที่ใช้ในการคำนวณ
End Function

วิธีสร้างสูตรเพื่อใช้กับแฟ้มใดแฟ้มหนึ่งโดยเฉพาะ

  1. ให้เปิด VBE ขึ้นมาแล้ว Insert > Module
  2. พิมพ์คำว่า function ตามด้วยชื่อสูตร และวงเล็บของชื่อตัวแปร
  3. กดปุ่ม Enter จะพบคำว่า End Function พิมพ์เป็นบรรทัดสุดท้ายให้เอง
  4. ให้พิมพ์รหัสที่ต้องการใช้คำนวณลงไปในบรรทัดระหว่าง Function...End Function

ตัวอย่างที่ 1 : สูตรที่จะแสดงสูตรของเซลล์ที่ต้องการ

Function FML(cell)
    FML = cell.Formula
End Function

เมื่อต้องการใช้สูตรในตาราง เช่น ต้องการแสดงสูตรจากเซลล์ A1 ให้พิมพ์ =FML(A1)

ตัวอย่างที่ 2 : สูตรที่ใช้ตรวจสอบว่ามีสูตรในเซลล์นั้นๆหรือไม่

Function HasFML(cell)
    HasFML = cell.HasFormula
End Function

เมื่อต้องการใช้สูตรในตาราง เช่น ต้องการตรวจสอบว่าเซลล์ A1 มีสูตรสร้างไว้หรือไม่ ให้พิมพ์ =HasFML(A1) จะได้คำตอบเป็น True/False

ตัวอย่างที่ 3 : สูตรหายอดรวมเฉพาะเซลล์ที่เป็นตัว Bold

Function BoldSum(rngCells)
    BoldSum = 0
    For Each c In rngCells
       If c.Font.Bold Then BoldSum = BoldSum + c.Value
    Next c
End Function

เมื่อต้องการหายอดรวมของตัวเลขในตาราง A1:B10 โดยให้รวมเลขจากเซลล์ที่ใช้ตัวเข้มหนาเท่านั้น ให้สร้างสูตร =BoldSum(A1:B10)*Now()/Now()

สาเหตุที่ต้องนำ Now()/Now() คูณเข้าไป เพื่อทำให้สูตรนี้คำนวณใหม่ทุกครั้งเมื่อเรากดปุ่ม F9

วิธีสร้างสูตรเพื่อใช้กับแฟ้มใดก็ได้ (Add-in)

Add-in มิได้มีรหัสอื่นใดที่แตกต่างจากตัวอย่างข้างต้น เพียงแค่สั่ง save แฟ้มโดยเลือก Save as type เป็น Microsoft Office Excel Add-In (*.xla) จะได้แฟ้มใหม่ในชื่อเดียวกับแฟ้มเดิม โดยแฟ้มใหม่ที่เกิดขึ้นนี้มีนามสกุล xla

ก่อนที่จะ save เป็น xla ควรปรับปรุงแฟ้มในส่วนต่อไปนี้

  • เนื่องจากแฟ้ม xla ที่จะนำมาใช้งานต่อไปนั้น ใช้เป็นแฟ้มที่นำสูตร Function VBA ที่เราสร้างขึ้นมาใช้งาน โดยไม่ได้ใช้เนื้อที่ชีทแสดงขึ้นบนจอ ดังนั้นเพื่อทำให้ประหยัดหน่วยความจำ ควรลบชีททิ้งให้หมดจนเหลือเพียงชีทเดียว เพื่อทำให้แฟ้ม xla มีขนาดเล็กที่สุดเท่าที่จะทำได้
  • ควรทำคำอธิบายประกอบสูตรแต่ละสูตร โดยสั่ง Developer > Macros ซึ่งจะไม่พบชื่อ Macro ที่เป็น Function VBA แสดงไว้ ให้พิมพ์ชื่อสูตรตามที่ตั้งชื่อไว้ลงไปในช่อง Macro name จะพบว่าปุ่ม Options แสดงขึ้น ให้คลิกเข้าไปแล้วพิมพ์คำอธิบายสูตรลงในช่อง Description (คำอธิบายสูตรนี้จะแสดงประกอบตัวสูตร เมื่อใช้คำสั่ง Formulas > Insert Function จะพบสูตรแสดงไว้ในส่วนของ User Defined)
  • ควรใช้ตารางในชีทเดียวที่เหลืออยู่ สร้างตัวอย่างวิธีการใช้สูตร และบันทึกชื่อผู้สร้างไว้ด้วย แล้วสั่ง Protect Sheet
  • ควรใช้คำสั่ง File > Info > Properties บันทึกรายละเอียดโดยย่อสั้นๆของแฟ้มสูตรลงในช่อง Title และบันทึกรายละเอียดเพิ่มเติม โดยเฉพาะข้อมูลเรื่องลิขสิทธิ์ ลงในช่อง Comments (เมื่อนำ Add-in มาใช้งาน จะพบข้อความที่บันทึกใน Properties นี้แสดงให้เห็นในช่อง Add-Ins Available แทนที่จะแสดงแค่ชื่อแฟ้มให้เห็นเท่านั้น)
  • ควรสั่ง Protect Workbook เพื่อป้องกันไม่ให้แก้ไข Properties ที่บันทึกรายละเอียดไว้
  • ในส่วนของรหัสที่สร้างไว้ใน VBE ควรสั่ง Tools > VBAProject Properties > Protection แล้วกาช่อง Lock project for viewing (เพื่อกันไม่ให้เห็นโครงสร้างภายในแฟ้มว่ามีชีทอย่างไร) และใส่รหัสป้องกันไว้ด้วย

ถ้างานใดสามารถใช้เมนูคำสั่งของ Excel ได้โดยตรง ควรใช้คำสั่งของ Excel ที่มีอยู่แล้วดีกว่า เพราะนอกจากจะสะดวกกว่าการใช้ VBA แล้ว ยังทำงานรวดเร็วกว่ามาก

  • F5 > Special
    ใช้ในการค้นหาเซลล์ลักษณะต่างๆในตาราง
  • Home > Find and Select
    ใช้ค้นหาค่าและเปลี่ยนแปลงค่าในเซลล์
  • Data > What-If Analysis > Goal Seek
    ใช้คำนวณย้อนกลับ เพื่อหาค่าตัวแปรใหม่ จนได้ผลลัพธ์ตามต้องการ
  • Data > What-If Analysis > Data Table
    ใช้ส่งค่าตัวแปรไปคำนวณซ้ำ
  • ปุ่ม F4
    สั่งให้ Excel ทำงานตามคำสั่งล่าสุดซ้ำอีกครั้ง  

หากต้องการออกจากวงจรการทำงานซ้ำให้ใช้รหัส If ช่วยตามแบบต่อไปนี้

  • If Selection.Value > 10 Then Exit For
  • If Selection.Value > 10 Then Exit Do
  • If Selection.Value > 10 Then Exit Sub

หมายเหตุ Exit Sub เป็นการสั่งให้ออกจากชุดคำสั่งที่กำลังทำงานอยู่ แล้วกลับไปทำงานตามคำสั่งถัดไปในชุดคำสั่งที่เป็นตัวสั่งเรียกชุดคำสั่งอื่นทำงาน (ถ้าใช้ End จะหยุดการทำงานทั้งหมด)

 

For Each element In group
    [statements]
    [Exit For]
    [statements]
Next [element]

  • element เป็นตัวแปรที่เรากำหนดให้แทนแต่ละส่วนของ group โดยจะตั้งชื่อตัวแปรนี้เป็นคำว่าอะไรก็ได้
  • group เป็นกลุ่มของ Object เช่น พื้นที่ตารางที่มีหลายเซลล์ หรือแฟ้มที่มีหลายชีท

ตัวอย่าง

ต้องการปรับค่าในตารางที่ตั้งชื่อว่า Source ถ้าเซลล์ใดในตารางนี้ มีค่าน้อยกว่า 0 ให้ปรับค่าให้เป็น 0

For Each c In [Source]
    c.Select
    If c.Value < 0 Then c.Value = 0
Next c

c เป็นตัวแปรที่เราตั้งขึ้นเพื่อใช้แทน แต่ละเซลล์ในตารางที่มีชื่อว่า Source

การทวนซ้ำจนสมบูรณ์ตามเงื่อนไข

โครงสร้างรหัสซึ่งสามารถนำมาใช้ทำงานทวนซ้ำจนเงื่อนไขสมบูรณ์มีหลายแบบ เช่น

Do [{While | Until} condition]
    [statements]
    [Exit Do]
    [statements]
Loop

หรือ

Do
    [statements]
    [Exit Do]
    [statements]
Loop [{While | Until} condition]

ตัวอย่าง

ต้องการปรับเพิ่มค่าของเลขที่บันทึกไว้ใน column โดยให้ทำงานเฉพาะพื้นที่เซลล์ที่ที่มีค่าบันทึกไว้ เป็นตารางติดต่อกันไปเริ่มจากเซลล์ A1

Range("A1").Select
Do Until Selection.Value = ""
    Selection.Value = Selection.Value + 1
    Selection.Offset(1, 0).Select
Loop

  • Do Until Selection.Value = ""
    สั่งให้ทวนซ้ำไปจนกว่าจะพบว่าเซลล์เป็นช่องว่าง
  • Selection.Value = Selection.Value + 1
    ปรับค่าในเซลล์ที่เลือกให้มีค่าเพิ่มอีก 1
  • Selection.Offset(1, 0).Select
    เลือกเซลล์ row ถัดไปข้างล่าง ใน column เดิม
  • ถ้าใช้ Do While Selection.Value <> ""
    สั่งให้ทวนซ้ำไปเรื่อยๆ ตราบใดที่เซลล์ที่เลือกไม่เป็นเซลล์ว่าง

นอกจากนี้ยังมีรหัสแบบ While...Wend แต่ไม่แนะนำให้ใช้ เพราะไม่ยืดหยุ่นเท่า Do...Loop


For...Next Statements เป็นรหัสที่ใช้สั่งให้ทำงานทวนซ้ำตามจำนวนรอบที่เรากำหนด โดยมีโครงสร้างการเขียนดังนี้

For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
Next [counter]

  • counter เป็นตัวแปรที่กำหนดขึ้น ส่วนมากจะกำหนดชื่อตัวแปรเป็น i, j, k
  • start เป็นเลขเริ่มต้นของรอบแรก
  • end เป็นเลขสุดท้ายของรอบสุดท้าย
  • step เป็นช่วงของเลขที่ต้องการให้บวกเพิ่มให้กับ counter ในรอบถัดไป ถ้าละส่วนของ step ไม่กำหนดลงไป จะถือว่า step=1
  • statements เป็นรหัสคำสั่งที่ต้องการให้ทำงานซ้ำ
  • Exit For ใช้กับกรณีที่ต้องการใช้เงื่อนไขให้เลิกทำงานวนซ้ำ


ตัวอย่าง

ต้องการสั่งพิมพ์สลิปเงินเดือนให้กับพนักงานทุกคน

image027

For i = 1 To [Total]
    [Choice] = i
    ActiveWindow.SelectedSheets.PrintPreview
    ActiveWindow.SelectedSheets.PrintOut
Next i

  • Total เป็น Range Name ในตารางที่เก็บรายละเอียดเงินเดือนพนักงาน โดยมีสูตร =CountA(ตารางชื่อพนักงานทั้งหมด) เพื่อหายอดจำนวนพนักงานทั้งหมด
  • For i = 1 To [Total]
    ทำหน้าที่สั่งให้เริ่มทำงานทวนซ้ำ ตั้งแต่รอบที่ 1 ถึง รอบสุดท้ายเท่าจำนวนพนักงานทั้งหมด
  • Choice เป็น Range Name ใช้สำหรับรับเลขที่พนักงาน เพื่อใช้เลขที่พนักงานนี้ไปค้นหาข้อมูลของพนักงานเลขที่นั้นๆ นำมาแสดงในใบสลิปเงินเดือน
  • ในตารางที่เตรียมไว้เป็นแบบสลิปเงินเดือน ให้ใช้สูตร Index เพื่อดึงข้อมูลของพนักงานตามเลขที่แสดงไว้ใน Choice เช่น ถ้าต้องการชื่อพนักงานที่เก็บไว้ใน column แรก ให้ค้นหาข้อมูลมาแสดงในสลิปโดยใช้สูตร
    =Index(MyData,Choice,1)
  • [Choice] = i
    ทำหน้าที่ส่งค่า i ไปที่เซลล์ Choice จึงทำให้สูตร Index คำนวณตาม แล้วสูตร Index จะดึงข้อมูลของพนักงานตามเลขที่ของ i มาแสดงในใบสลิป ทั้งนี้ระบบการคำนวณต้องเป็น Automatic อยู่แล้วด้วย (แนะนำให้เพิ่มรหัสว่า Calculate ต่อท้ายบรรทัดนี้ เพื่อสั่งให้แฟ้มคำนวณ โดยไม่ต้องห่วงว่าแฟ้มเป็น Automatic หรือไม่)
  • ActiveWindow.SelectedSheets.PrintPreview
    ActiveWindow.SelectedSheets.PrintOut
    ทำหน้าที่แสดงภาพสลิปบนหน้าจอให้เห็นก่อน รอให้เราคลิกสั่งปิด Print Preview จากนั้นจึงสั่งให้พิมพ์สลิปโดยอัตโนมัติ
    (ถ้าต้องการให้พิมพ์สลิปทันทีโดยไม่ต้องหยุดแสดงภาพที่จะพิมพ์บนจอ ให้ใช้รหัสคำสั่งบรรทัด PrintOut เพียงบรรทัดเดียว)
  • Next i
    ทำหน้าที่สั่งให้วนกลับไปเพิ่ม i = i+1 เป็นรายการถัดไป ขอแนะนำให้เขียนตัว i ต่อท้าย Next ไว้เสมอ เพื่อแสดงว่า Next ตัวนี้เป็นชุดของ i
  • หากต้องการปรับปรุงรหัสให้ดีขึ้น แทนที่จะให้เริ่มจากเลข 1 ไปจนถึงคนสุดท้ายตามค่าที่ส่งมาจากตาราง ควรใช้ InputBox กำหนดค่า i และ Total เพื่อจะได้เลือกสั่งพิมพ์จากรายการใดก็ได้ และเมื่อพิมพ์เสร็จแล้ว ควรย้อนค่าใน Choice กลับเป็นเลขเริ่มต้นเดิม หรือเป็นเลข 1 เพื่อแสดงรายการแรก ดีกว่าปล่อยให้ตารางแสดงข้อมูลรายการสุดท้ายค้างไว้


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

ก่อนอื่นมาดูกันอีกทีว่า ชุดคำสั่ง SendData มีหน้าตาอย่างไรและทำงานได้อย่างไร

Sub SendData()
    MyVar = [Source]
    [Target] = MyVar
End Sub

ชุดคำสั่งนี้ สั่งให้ข้อมูลที่อยู่ใน Range Name ชื่อ Source ส่งไปพักไว้ในตัวแปรชื่อ MyVar จากนั้นจึงสั่งให้ MyVar ส่งข้อมูลที่เก็บไว้ต่อไปยัง Range Name ชื่อ Target

ตัวอย่าง

image016

สิ่งที่ต้องการ

ส่งตัวเลข 777 หรือค่าใดๆที่บันทึกไว้ในเซลล์ B4 ไปเก็บไว้ในตารางชื่อ MyData ณ ตำแหน่ง row ที่ 5 ตัดกับ column ที่ 2 หรือตำแหน่งอื่นใดก็ได้ที่อยู่ใน MyData

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Source ให้กับเซลล์ B4
  2. สร้าง Range Name ชื่อ MyData ให้กับเซลล์ D2:F10
  3. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =INDEX( MyData, $B$2, $B$3)

วิเคราะห์สูตร

Target
=INDEX( MyData, $B$2, $B$3 )

เมื่อกำหนดตำแหน่ง Row และ Column ลงไปในเซลล์ B2 และ B3 ตามลำดับ จะส่งผลให้ข้อมูลจาก Source ส่งไปที่ MyVar ต่อไปยัง Target แล้วสูตร Index จะเป็นตัวกำหนดตำแหน่ง Row และ Column ของเซลล์ที่รับค่าในที่สุด

ต้องระวังในการกำหนดตำแหน่ง Row และ Column เพราะสูตร Index สามารถรับค่าลงไปเฉพาะขอบเขตพื้นที่ของ MyData เท่านั้น ซึ่ง MyData มีขนาดความสูง 9 row และมีความกว้าง 3 column จึงทำให้เลข Row และ Column ช่วงที่ใช้ได้ คือ Row ที่ 1 - 9 และ Column ที่ 1 - 3

คอมพิวเตอร์จะทำหน้าที่สมกับที่เป็นคอมพิวเตอร์ ต่อเมื่อเราสามารถสั่งให้คอมพิวเตอร์ทำงานเองตั้งแต่ต้นจนจบ และสามารถทำงานซ้ำแล้วซ้ำอีกได้ตามต้องการ โดยลักษณะการทำงานทวนซ้ำ (Looping) นี้มีหลายแบบ ได้แก่

  1. การทวนซ้ำตามจำนวนรอบที่เรากำหนด
  2. การทวนซ้ำตามจำนวนข้อมูล
  3. การทวนซ้ำจนสมบูรณ์ตามเงื่อนไข

สมมติว่าเรากำลังอยู่ในแฟ้มที่มี Range Name ชื่อ Source และ Target และต้องการสร้างชุดคำสั่งเพื่อทำหน้าที่ส่งค่ารวมทั้ง Format จาก Source ไปยัง Target ให้ใช้ Recorder บันทึกตามขั้นตอนต่อไปนี้

  1. กดปุ่ม F5 เลือกไปยัง Source
  2. กดปุ่ม Ctrl+c เพื่อสั่ง Copy
  3. กดปุ่ม F5 เลือกไปยัง Target
  4. กดปุ่ม Enter เพื่อ Paste

ชุดคำสั่งที่ได้จากการใช้ Macro Recorder

Sub CopySource2Target()
    Application.Goto Reference:="Source"
    Selection.Copy
    Application.Goto Reference:="Target"
    ActiveSheet.Paste
End Sub

แต่ถ้าไม่ต้องการนำ Format ตามไปที่ Target ด้วย ให้เปลี่ยนการบันทึก Macro ขั้นที่ 4 เป็น การคลิกขวาแล้วเลือก Paste Special > Values จะทำให้เกิดชุดคำสั่งต่างจากเดิมเล็กน้อยเป็น

Sub CopyDataSource2Target()
     Application.Goto Reference:="Source"
     Selection.Copy
     Application.Goto Reference:="Target"
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub

ซึ่งจะพบว่ารหัสในขั้นตอนการ Paste Special ที่ได้จากการบันทึก Macro เป็นรหัสที่ยาวเกินต้องการ ขอให้ตัดเหลือเพียง Selection.PasteSpecial Paste:=xlPasteValues ก็พอ กลายเป็นชุดคำสั่งที่สั้นและอ่านได้ความตามที่ต้องการมากขึ้นเป็น

Sub CopyDataSource2Target()
     Application.Goto Reference:="Source"
     Selection.Copy
     Application.Goto Reference:="Target"
     Selection.PasteSpecial Paste:=xlPasteValues
End Sub

  • Application.DisplayAlerts = False
    Workbooks("BOOK1.XLS").Close
    Application.DisplayAlerts = True
    ยกเลิกการเตือนให้ save changes เมื่อปิดแฟ้ม
     
  • Application.ScreenUpdating = False
    ....
    Application.ScreenUpdating = True
    ยกเลิกการปรับภาพที่แสดงการทำงานใดๆให้เห็นบนจอ
     
  • Application.StatusBar = "Please be patient..."
    Workbooks.Open filename:="LARGE.XLS"
    Application.StatusBar = False
    ในระหว่างที่กำลังเปิดแฟ้ม ให้แสดงข้อความให้เห็นบน Status Bar ด้านซ้ายล่างของจอ และเมื่อเปิดแฟ้มเสร็จแล้วให้ลบข้อความออก  

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

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

ชุดคำสั่งที่ใช้รับส่งข้อมูล มีเพียง 2 บรรทัด

Sub SendData()
    MyVar = [Source]
    [Target] = MyVar
End Sub

ข้อกำหนดในการใช้งาน

  1. Source และ Target เป็น Range Name หรือ Formula Name ก็ได้
  2. Source คือ ตารางต้นทางที่ส่งข้อมูล
  3. Target คือ ตารางปลายทางที่รับข้อมูล
  4. ขนาดตารางของทั้ง Source และ Target ต้องมีขนาดเท่ากัน เช่น ถ้า Source เป็นเซลล์เดียว ดังนั้น Target ก็ต้องเป็นเซลล์เดียวด้วย แต่ถ้า Source เป็นตารางที่มีขนาดความสูง 2 row ความกว้าง 3 column ดังนั้น Target ต้องเป็นตารางที่มีขนาดความสูง 2 row ความกว้าง 3 column เช่นกัน
  5. ขณะที่สั่งให้คำสั่งชุดนี้ทำงาน แฟ้มที่มีตารางที่ตั้งชื่อว่า Source และ Target ต้องเปิดและกำลังใช้งานอยู่
  6. Source หรือ Target ไม่จำเป็นต้องเป็นตารางในชีทเดียวกัน โดยจะเป็นตารางที่อยู่ต่างชีทหรือต่างแฟ้มกันก็ได้ เช่น Target เป็นชื่อ Range Name ที่ตั้งไว้ในแฟ้ม Book1.xls แต่อาจกำหนดให้ Refers to พื้นที่ตารางใน Book2.xls (ในกรณีนี้ ขณะที่สั่งให้ชุดคำสั่งนี้ทำงาน ต้องเปิดแฟ้ม Book1.xls และ Book2.xls และต้องเลือกอยู่ในแฟ้ม Book1.xls เพราะเป็นแฟ้มที่มีชื่อ Range Name Source และ Target)
  7. สามารถตั้งชื่อตารางเป็นชื่ออื่นได้ตามต้องการ โดยแก้ชื่อที่ใช้ในรหัสให้ถูกต้องตามชื่อที่ตั้งไว้ ต้องสะกดชื่อตามให้ถูกต้องตรงกันทุกตัวอักษร ชื่อในรหัสไม่จำเป็นต้องใช้อักษรตัวใหญ่ตัวเล็กตามชื่อใน Excel แต่ถ้าตรงกันได้ทุกตัวจะดีกว่า

คำอธิบายขั้นตอนการทำงานของชุดคำสั่ง SendData

  1. MyVar เป็นชื่อตัวแปรที่ตั้งขึ้น (Array Variable) ซึ่งจะเปลี่ยนเป็นชื่ออื่นใดก็ได้ สำหรับรับข้อมูลที่มาจาก Range Name ชื่อ Source
  2. จากนั้น Range Name ชื่อ Target จะรับข้อมูลที่เก็บไว้ใน MyVar
  3. คำว่า Source และ Target ที่พิมพ์ไว้ในระหว่างเครื่องหมาย [ ] เป็นการใช้แบบ Evaluate ทำให้ VBE ค้นหาต่อเองว่าทั้ง Source และ Target เป็น Range Name
  4. เราใช้ MyVar เป็นสื่อกลางในการรับส่งข้อมูลระหว่าง Source และ Target ซึ่งเฉพาะตัวค่าของข้อมูลเท่านั้นที่จะถูกส่งไปเก็บไว้ที่ Target ถ้าใน Source มีเซลล์สูตร =1+2 จะส่งผลลัพธ์เป็นเลข 3 ไปเก็บไว้ที่ Target สิ่งอื่นนอกจากค่าผลลัพธ์ เช่น Format จะไม่ถูกส่งออกไป
  5. ถ้าตัด MyVar ออกแล้วใช้คำสั่ง [Target] = [Source] บรรทัดเดียว จะใช้รับส่งข้อมูลได้เฉพาะเซลล์เดียวเท่านั้น
  6. กรณีต้องการสั่งให้รหัสชุดนี้ทำงาน และในขณะนั้นมีแฟ้มหลายแฟ้มกำลังเปิดใช้งานร่วมกันอยู่ ควรเพิ่มรหัสบรรทัดแรก ให้ทำหน้าที่ย้ายไปดูแฟ้มที่มี Range Name ชื่อ Source และ Target ตั้งชื่อไว้ เช่น ถ้าเป็น Range Name ที่อยู่ในแฟ้มชื่อ Book1.xls ให้แก้ไขรหัสเป็น

Sub SendData()
    Windows("Book1.xls").Activate   ‘รหัสไม่ดีเพราะ ชื่อ Book1.xls
    MyVar = [Source]
    [Target] = MyVar
End Sub

หรือ

Sub SendData()
    ThisWorkbook.Activate              ‘รหัสนี้ดี เพราะไม่ระบุชื่อแฟ้ม
    MyVar = [Source]
    [Target] = MyVar
End Sub

หมายเหตุ ThisWorkbook หมายถึง ตัวแฟ้มที่มี Module เก็บชุดคำสั่งที่กำลังทำงาน ดังนั้นเมื่อชุดคำสั่ง SendData ทำงาน แล้วพบคำสั่ง ThisWorkbook.Activate จะทำให้แฟ้มที่เก็บชุดคำสั่ง SendData ถูกเลือกขึ้น ซึ่งย่อมเป็นแฟ้มเดียวกันกับแฟ้มที่มี Range Name ชื่อ Source และ Target นั่นเอง

นอกจากจะใช้ InputBox แบบที่เป็นสูตรแล้ว ยังมี InputBox แบบ Method อีกด้วย ซึ่งสามารถใช้เลือกบันทึกเป็นตัวเลข ตัวอักษร หรือสูตร โดยมีโครงสร้างดังนี้

InputBox(Prompt, Title, Default,,,,, Type)

ตัวอย่างการใช้งาน

[Source] = Application.InputBox("Value is : ", "Expert", [Source], , , , , 1)

image026

  • ต้องพิมพ์คำว่า Application. นำหน้า InputBox
  • สังเกตว่า ตำแหน่งของปุ่ม OK Cancel จะวางไว้แนวนอน
  • ค่าของ Type เพื่อควบคุมค่าที่ใช้ในการบันทึก

0  

A formula

1

A number

2

Text (a string)

4

A logical value (True or False)

8

A cell reference, as a Range object

16

An error value, such as #N/A

64

An array of values

  • ถ้าต้องการใช้ Type 2 อย่างพร้อมกัน ให้นำเลข Type มาบวกกัน เช่น ถ้าต้องการเปิดรับค่าที่เป็นตัวเลขหรือตัวอักษร ให้ใส่เลข 3 (=1+2)

image015

 

InputBox(prompt[, title] [, default])

ตัวอย่างการใช้งาน

[Source] = InputBox("Value is : ", "Expert", [Source])

image025

InputBox แสดงค่าที่บันทึกไว้ในเซลล์ Source และเปิดให้บันทึกค่าใหม่แทนค่าเดิม

  1. อย่าใช้ VBA ถ้าเราสามารถใช้เมนูหรือสูตรหาคำตอบที่ต้องการได้อยู่แล้ว นอกจากช่วยประหยัดเวลาของเรา ไม่ต้องหาทางสร้างรหัส VBA ขึ้นเอง การใช้เมนูหรือสูตร ยังทำให้ Excel ทำงานเร็วกว่าการใช้ VBA อย่างมาก (คำสั่งบนเมนูและสูตรที่ Microsoft สร้างไว้ให้นั้น จะทำงานได้เร็วมาก เพราะไม่ต้องเสียเวลาแปลรหัสเป็นภาษาเครื่อง ต่างจาก VBA ที่เราเขียนเอง ซึ่งยากจะเขียนรหัสที่มีประสิทธิภาพได้เทียบเท่า Microsoft)
  2. ต้องออกแบบตารางให้ถูกต้อง แล้วทดลองใช้คำสั่งบนเมนู และใช้สูตร จนได้ขั้นตอนที่ลัดที่สุดที่ทำได้
  3. ใช้ Macro Recorder บันทึกขั้นตอนการใช้คำสั่งบนเมนู แทนการเขียนรหัสเองทั้งหมด
  4. รหัส VBA ที่สร้างไว้นั้น ต้องสร้างแบบยืดหยุ่น สามารถใช้รหัสเดิมทำงานต่อไปได้ตลอด ไม่ต้องเสียเวลาย้อนกลับมาแก้ไขรหัสอีกในภายหลัง ไม่ว่าโครงสร้างตาราง ชื่อชีท ชื่อแฟ้ม ชื่อโฟลเดอร์จะต่างไปจากเดิมหรือไม่อย่างไร
  5. ค่าคงที่หรือตัวแปรทั้งหมดที่ใช้ในรหัส VBA ให้ link ต่อมาจาก Excel โดยใช้ Range Name หรือ Formula Name เป็นสื่อกลาง
  6. ถ้าจำเป็นต้องแก้ไข ให้แก้ไขเฉพาะส่วนที่อยู่ใน Excel เนื่องจากเป็นสิ่งที่เราคุ้นเคย ใช้งานทุกวัน สามารถแก้ไขได้ง่ายและสะดวกกว่าเข้าไปแก้รหัสใน VBE
  7. หลีกเลี่ยงการลบรายการที่เลิกใช้งานทิ้ง เพราะการลบข้อมูลทิ้ง ย่อมเสียข้อมูลเก่านั้นไป แต่ให้ใช้วิธีเขียนกำกับรายการที่เลิกใช้งาน เช่น ใช้เซลล์ที่มีเลข 99 กำกับรายการใดเพื่อแสดงว่า รายการนั้นเลิกใช้ไปแล้ว
  8. หลีกเลี่ยงการแทรกรายการใหม่เข้าไประหว่างรายการเก่า แต่ให้บันทึกข้อมูลรายการใหม่ ต่อท้ายรายการเก่าทั้งหมดต่อกันไปเรื่อยๆ แล้วจึงนำข้อมูลไปจัดเรียงในพื้นที่อื่น เป็นตารางใหม่ที่จัดเรียงตามต้องการ
  9. ควรเลือกใช้ VBA ลดขั้นตอนที่จำเป็นเท่านั้น อย่าพยายามเขียน VBA เพื่อหาทางทำให้งานทุกขั้นตอนทำงานเองโดยอัตโนมัติ เพราะรหัสจะมีความซับซ้อนและยากขึ้นมาก ลองนึกเผื่อไว้ด้วยว่า คนอื่นรุ่นหลังจะสามารถแกะรหัสเดิม มาแก้ไขหรือพัฒนาต่อไหวหรือไม่  

MsgBox(prompt[, buttons] [, title])

ตัวอย่างการใช้งาน

  1. MsgBox "Value is : " & [Source]
    แสดงค่าในเซลล์ชื่อ Source

    image022
  2. MyVar = MsgBox("Value is : " & [Source], vbOKCancel)
    If MyVar = vbOK Then [Target] = [Source]

    image023

    แสดงค่าในเซลล์ชื่อ Source แล้วถ้ากดปุ่ม OK
    จะส่งค่าจาก Source ไปเก็บไว้ที่ Target
    สังเกตว่า หลัง MsgBox มีวงเล็บเพื่อทำงานแบบสูตร
  3. ถ้าแก้ไขเพิ่มเติมรหัสบรรทัดแรกในข้อ 2 เป็น
    MyVar = MsgBox("Value is : " & [Source], vbOKCancel
    + vbDefaultButton2, "Expert")

    image024

    สังเกตว่า คราวนี้ปุ่ม Cancel เป็นปุ่มที่พร้อมใช้แทน และมีคำำว่า Expert แทน คำว่า Microsoft Excel ในส่วนที่เป็น Title ด้านบน

เราสามารถเลือกใช้ปุ่มได้หลายประเภท โดยใช้รหัสต่อไปนี้แทนลงไปในส่วนของ buttons

  • vbOKOnly
  • vbOKCancel
  • vbAbortRetryIgnore
  • vbYesNoCancel
  • vbYesNo
  • vbRetryCancel
  • vbCritical
  • vbQuestion
  • vbExclamation
  • vbInformation  

ในกรณีที่ใช้ปุ่มหลายปุ่ม ให้ใช้รหัสต่อไปนี้บวกต่อท้ายรหัสปุ่ม เพื่อเลือกให้เป็นปุ่มที่พร้อมใช้งานเมื่อกดปุ่ม Enter

  • vbDefaultButton1
  • vbDefaultButton2
  • vbDefaultButton3

 

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

โครงสร้างสูตร IF
ใช้หาคำตอบตามเงื่อนไข

=IF(เงื่อนไข, ผลหากเงื่อนไขเป็นจริง, ผลหากเงื่อนไขเป็นเท็จ)

ตัวอย่าง ให้หาคำตอบถ้ายอดรวมของ Amount ทั้งหมด มีค่ารวมแล้วมีค่ามากกว่าหรือเท่ากับ 100 ให้ตอบว่า OK แต่ถ้ายอดรวมไม่ถึง 100 ให้ตอบว่า No จะต้องสร้างสูตรต่อไปนี้

=IF( Sum(D3:D7)>=100, "OK", "No")
  คำตอบ คือ OK

โครงสร้างสูตร VLookup
ใช้หาค่าในตาราง

=VLookup(รหัสที่ใช้หา, ตารางเก็บข้อมูล, เลข column ของคำตอบเรื่องที่ต้องการ, 0)

ตัวอย่าง ต้องการหาว่า รหัส Id a003 มีชื่ออะไร และมียอดเป็นเท่าใด ให้ใช้สูตรต่อไปนี้ตามลำดับ

=VLookup("a003", B3:D7 , 2, 0)
   คำตอบ คือ C

=VLookup("a003", B3:D7 , 3, 0)
   คำตอบ คือ 30

เลข 2 และ 3 ที่ใส่ไว้ในสูตร คือ เลขของ column ของ Name และ Amount ซึ่งอยู่ใน column ที่ 2 และ 3 ตามลำดับในพื้นที่ตาราง B2:D7

เลข 0 ที่ใส่ไว้ด้านหลังสุดในสูตร เป็นการกำหนดให้ใช้สูตร VLookup หาค่าแบบ Exact Match โดยจะหาค่าเฉพาะเมื่อมีค่าตรงกับรหัสที่ใช้หาเท่านั้น แต่ถ้าไม่ใส่เลข 0 จะทำให้ VLookup ทำงานแบบ Approaching Match โดยจะหาค่ามาให้เสมอ แม้ว่าไม่มีรหัสตรงกันก็ตาม ซึ่งโดยทั่วไปถ้าใช้รหัสเป็นค่าที่ใช้ค้นหาคำตอบ ต้องใช้แบบ Exact Match

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

โครงสร้างสูตร Match
ใช้หาตำแหน่งของค่าในตาราง

=Match(รหัสที่ใช้หา, พื้นที่แนวตั้งของรหัสทั้งหมด, 0)

ตัวอย่าง ต้องการหาว่ารหัส a003 เป็นรายการที่เท่าใด ให้ใช้สูตรดังนี้

=Match("a003", B3:B7, 0)
   คำตอบ คือ 3

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

โครงสร้างสูตร Index
ใช้หาค่า ที่อยู่ตามตำแหน่งของค่าในตาราง

=Index(ตารางเก็บข้อมูล, เลขที่ Row, เลขที่ Column)

ตัวอย่าง ต้องการหาค่าจากพื้นที่ตาราง B3:D7 ณ ตำแหน่ง row ที่ 2 ตัดกับ column ที่ 3 ให้ใช้สูตรดังนี้

=Index(B3:D7, 2, 3)
   คำตอบ คือ 20

โครงสร้างสูตร Offset แบบสั้น
ใช้หาค่า ที่อยู่ตามตำแหน่งถัดไปจากตำแหน่งเซลล์อ้างอิงที่กำหนด

=Offset(เซลล์อ้างอิง, จำนวน row ถัดไป, จำนวน column ถัดไป)

ตัวอย่าง ต้องการหาค่า ที่อยู่ถัดจากเซลล์ B3 ลงไป 1 row และถัดไปจากเซลล์ B3 ไปด้านขวา 2 column ให้ใช้สูตรดังนี้

=Offset(B3, 1, 2)
   คำตอบ คือ 20

โครงสร้างสูตร Offset แบบเต็ม
ใช้หาค่าหลายค่า เสมือนเป็นพื้นที่ตาราง

=Offset(เซลล์อ้างอิง, จำนวน row ถัดไป, จำนวน column ถัดไป,
ความสูงของตาราง, ความกว้างของตาราง)

ตัวอย่าง ต้องการใช้สูตรกำหนดพื้นที่ของตัวเลข Amount ซึ่งจะเห็นได้ว่ามีเลข 10, 20, 30, 40, 50 เก็บไว้ ให้ใช้สูตรดังนี้

=Offset(B3, 0, 2, 5, 1)
   คำตอบ คือ {10;20;30;40;50}

สาเหตุที่ใส่เลข 0,2,5,1 นั้น เนื่องจากตารางข้อมูล Amount D3:D7 มีตำแหน่ง D3 อยู่ในแนว row เดียวกันกับ B3 จึงมีจำนวน row ถัดไปเท่ากับ 0 และตำแหน่ง D3 อยู่ถัดไปจาก B3 อีก 2 column โดย D3:D7 มีพื้นที่ความสูง 5 row และกว้าง 1 column

สูตรที่สร้างขึ้นนี้ อาจไม่เห็นคำตอบครบตามต้องการ ขอให้กดปุ่ม F2 แล้วตามด้วย F9 จะพบตัวเลข {10;20;30;40;50} และสังเกตว่า ระหว่างตัวเลขนั้น มีเครื่องหมาย semi-colon ; คั่น ซึ่งเครื่องหมาย ; นี้แสดงว่า ตัวเลขเป็นแนวตั้ง (ถ้าคั่นด้วยเครื่องหมาย comma , จะแสดงว่าเป็นแนวนอน) เมื่อเห็นตัวเลขแล้ว ให้กดปุ่ม Esc เพื่อกลับไปเป็นสูตรตามเดิม

โดยทั่วไปจะไม่ค่อยพบสูตร Offset แบบเต็มใช้ในเซลล์ใด แต่จะนำสูตร Offset แบบเต็ม ไปสร้างต่อเป็น Formula Name ผ่านเมนู Formula > Define Name  เพื่อตั้งเป็นชื่อ Formula Name นำมาใช้แทน Range Name

โครงสร้างสูตร CountIF
ใช้นับจำนวนเซลล์ เท่าที่มีค่าตามเงื่อนไข

=CountIF(พื้นที่ตาราง, "เงื่อนไข")

ตัวอย่าง ต้องการนับจำนวนรหัส a003 ว่ามีกี่เซลล์ ให้ใช้สูตรดังนี้

=CountIF(B3:B7, "a003")
   คำตอบ คือ 1

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

สูตรช่วยในการกำหนดพื้นที่ตาราง ที่ขยายหรือหดได้ตามจำนวนข้อมูล เรียกว่า Dynamic Range เช่น หากต้องการทำให้พื้นที่ของ Amount ซึ่งเดิมมาจากเซลล์ D3:D7 นั้น สามารถขยายหรือหดพื้นที่ได้ตามข้อมูลที่เพิ่มหรือลดได้เอง ให้สั่ง Formula > Define Name  ตั้งชื่อ Formula Name ว่า Amount และกำหนดสูตรต่อไปนี้ลงไปในช่อง Refers to

=Offset($B$3, 0, 2, CountA($D:$D)-1, 1)

สังเกตว่า ตำแหน่งของเซลล์ที่อ้างอิงในสูตรเป็น Absolute Reference โดยมีเครื่องหมาย $ กำกับตำแหน่งทั้ง row และ column ทั้งนี้เป็นการสร้างตามหลักของ Formula Name เพื่อทำให้ Amount มีตำแหน่งถูกต้องและมีตำแหน่งแน่นอน

สูตร CountA($D:$D)-1 ทำหน้าที่คำนวณหาความสูง โดยนับจำนวนรายการข้อมูลทั้งหมดจาก column D แต่เนื่องจากสูตร CountA นับหัวตารางเซลล์ D2 เกินเข้ามา 1 เซลล์ จึงต้องลบจำนวนที่นับได้ทิ้งไป 1 เซลล์

แทนที่จะต้องเริ่มต้นเรียนรู้โครงสร้างสูตรของ VBA ขอแนะนำให้นำสูตร Excel ที่เราคุ้นเคยดีอยู่แล้วมาใช้แทนกันดีกว่า โดยพิมพ์คำว่า Application.WorksheetFunction ตามด้วยจุด นำหน้าสูตร Excel เช่น

[Source] = Application.WorksheetFunction.Round([Source], 2)
ปรับตัวเลขใน Source โดยปัดขึ้นเป็นเลขทศนิยม 2 หลัก
เ้ดิม 12.345 จะปัดขึ้นเป็น 12.35

แต่ถ้าใช้สูตร Round ใน VBA

[Source] = Round([Source], 2)
เดิม 12.345 จะปัดเป็น 12.34

จะเห็นว่า สูตร Round ของ VBA คำนวณให้คำตอบต่างจาก Round ของ Excel โดยสูตร Round ของ VBA จะมีหลักพิจารณาเพิ่มเติมว่า ถ้าเลขหลักที่ต้องการเป็นเลขคู่อยู่แล้วจะไม่ปัดขึ้น

หากต้องการค้นหาว่ามีสูตร Excel ใดที่สามารถนำมาใช้ใน VBA ได้บ้าง ให้ค้นหาจาก VBA Help โดยค้นหาจากคำว่า List of Worksheet Functions Available to Visual Basic แล้วขอให้สังเกตว่าไม่มีสูตร If (โดยให้หันมาใช้ IIF ของ VBA แทน) หรือค้นหาจากพื้นที่ที่ใช้เขียนรหัส ให้พิมพ์คำว่า Application.WorksheetFunction แล้วพอพิมพ์เครื่องหมายจุดต่อท้ายคำ จะพบว่า VBE เปิดจอเล็กๆไล่ลำดับชื่อสูตรที่มีอยู่ เพื่อให้เลือกได้โดยตรงในขณะที่พิมพ์ให้ทันที

ก่อนจะเร่งรีบหาทางใช้ VBA มาจัดการกับฐานข้อมูล ยังมีคำสั่งบนเมนูหรือสูตรสำเร็จรูปของ Excel ที่นำมาช่วยงานจัดการฐานข้อมูลได้อีก และเชื่อหรือไม่ว่า ลักษณะโครงสร้างตารางที่ใช้เก็บข้อมูลนั่นแหละเป็นสิ่งสำคัญที่สุด ถ้าโครงสร้างตารางจัดไว้ไม่ดี ออกแบบตารางไว้ผิด อย่านึกเลยว่าจะใช้คำสั่งบนเมนู สูตร หรือแม้แต่ VBA มาช่วยในงานจัดการฐานข้อมูลได้ง่ายๆ

โครงสร้างตารางสำหรับเก็บข้อมูล

image014

ตารางฐานข้อมูลที่ดีต้องมีลักษณะโครงสร้าง ตามกฎ 3 ข้อดังนี้

  1. หัวตารางต้องใช้พื้นที่เซลล์ 1 row เท่านั้น จากภาพคือพื้นที่เซลล์ B2, C2, D2 แต่ถ้าอยากทำให้หัวตารางมีคำอธิบายเพิ่มเติมในอีกบรรทัด ให้ใช้วิธีกดปุ่ม Alt+Enter เพื่อขึ้นบรรทัดใหม่ในเซลล์เดิมต่อท้ายข้อความเดิม
  2. ห้ามเว้นว่าง row ทั้ง row ของทั้งรายการ เช่น ห้ามเว้นเซลล์ B3:D3 หรือ B5:D5 เป็นต้น และไม่ควรเว้นว่างเซลล์ใดเซลล์หนึ่งโดยไม่จำเป็น โดยเฉพาะเซลล์ที่เก็บข้อมูลที่เป็นรหัสหรือชื่อสินค้า ซึ่งใช้เป็นข้อมูลสำหรับใช้ค้นหาข้อมูลอื่นในแนวรายการเดียวกัน
  3. ห้ามนำตารางเก็บข้อมูลไปติดกับเซลล์ข้อมูลอื่น ทั้งด้านบน ด้านล่าง ด้านซ้าย และด้านขวาของตารางฐานข้อมูล ต้องเว้นว่างไว้รอบข้างอย่างน้อย 1 เซลล์โดยตลอด เพื่อทำให้ Excel รู้จักว่าพื้นที่เซลล์ที่ติดต่อกันนี้เป็นตารางเดียวกัน

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

ให้เริ่มจากคลิกเซลล์ใดเซลล์หนึ่งในพื้นที่ตารางเก็บข้อมูล แล้วเมื่อคลิกเลือกคำสั่งบนเมนู Data จะพบว่า Excel จะเลือกพื้นที่เฉพาะส่วนที่ต้องการนำมาใช้งานกับเมนูนั้นๆต่อให้เอง เช่น ถ้าสั่ง Data > Sort จะเลือกพื้นที่ B3:D7 เฉพาะส่วนที่เป็นข้อมูลรายการ หรือถ้าสั่ง Data > Filter จะเกิดปุ่ม Filter ขึ้นเฉพาะหัวตารางด้านบน B2:D2

 

Choose(index, choice-1[, choice-2, ... [, choice-n]])

Choose ใช้คำนวณหาผลลัพธ์ได้เช่นเดียวกับ IIF แต่ Choose ใช้เลข index ซึ่งเป็นเลขจำนวนเต็ม ช่วยในการตัดสินใจหาคำตอบที่เขียนต่อไว้ในสูตร

ตัวอย่าง

ถ้า Source มีค่าเป็นเลข 1-5 ให้เปลี่ยนค่าใน Source เป็นตัวอักษร a, b, c, d, e ตามลำดับ

[Source] = Choose([Source], "a", "b", "c", "d", "e")

แทนที่จะต้องเสียเวลาพิมพ์ตำแหน่งเซลล์ที่ต้องการว่า Range("Target") เราสามารถใช้วิธี Evaluate ผ่านเครื่องหมาย [ ] ทำให้รหัสสั้นลงเหลือเพียง [Target] ดังนั้นหากเรากำลังเปิดแฟ้มที่มี Range Name ชื่อ Target อยู่แล้ว และต้องการส่งตัวเลข 123 ไปที่เซลล์ชื่อ Target จึงใช้รหัส VBA ที่เขียนสั้นๆง่ายๆ ดังนี้

[Target] = 123

การ Evaluate เป็นการสั่งให้ตัว VBE ประเมินว่า คำว่า Target คืออะไร ซึ่งเนื่องจากแฟ้มที่กำลังใช้งานอยู่มี Range Name ชื่อ Target ดังนั้น VBE จะทราบเองต่อไปว่า ให้ส่งเลข 123 ไปที่ Target ซึ่งพบแล้วว่าเป็น Range Name คือตำแหน่งเซลล์ที่ตั้งชื่อไว้ว่า Target นั่นเอง

การ Evaluate ทำให้ VBE ทำงานช้าลงไปบ้าง แต่ทำให้เราเขียนรหัสอ้างถึงตำแหน่งอ้างอิงได้ง่ายกว่าเดิมมาก

ในกรณีที่ต้องการใช้สูตร IF ในโครงสร้างสูตรแบบเดียวกันกับที่ใช้สูตรใน Excel เราสามารถใช้สูตร IIF ใน VBA โดยมีโครงสร้างสูตร ดังนี้

IIf(expr, truepart, falsepart)

ตัวอย่าง

ถ้า Source มีค่ามากกว่า 1000 ให้ปรับค่าเหลือเท่ากับ 100

[Source] = IIF([Source] > 1000, 100, [Source])

โปรดสังเกตว่า เราใช้ IIF แบบสูตรเพื่อคำนวณหาผลลัพธ์ แต่ไม่ได้ใช้เพื่อสั่งให้รหัสคำสั่งอื่นทำงานโดยตรง ดังนั้นฝั่งซ้ายของ IIF จึงใช้เครื่องหมายเท่ากับเซลล์หรือตัวแปรที่ต้องการรับค่า

Range Name เป็นชื่อที่เราตั้งขึ้นให้กับเซลล์ โดยจะเป็นเซลล์เดียว หรือหลายเซลล์ก็ได้ ซึ่งชื่อ Range Name ที่ตั้งขึ้นนี้นอกจากจะช่วยทำให้สูตรมีความหมายชัดเจนในตัว มากกว่าการใช้สูตรอ้างอิงจากเซลล์โดยตรง (เช่น เดิมใช้สูตรหากำไร =A1-B1 แต่ต่อมาใช้ Range Name แทนจะเห็นสูตร =Income-Cost) เรายังใช้ Range Name ช่วยทำให้รหัส VBA ที่มีอยู่นั้น ไม่จำเป็นต้องถูกแก้ไขเปลี่ยนแปลงอีกต่อไป

วิธีตั้งชื่อ Range Name ให้กับเซลล์ สามารถใช้วิธีง่ายๆโดยคลิกเลือกเซลล์หรือพื้นที่ตารางที่ต้องการก่อน จากนั้นให้พิมพ์ชื่อลงในช่อง Name Box ซึ่งอยู่ด้านซ้ายสุดของ Formula Bar หรือจะใช้เมนู Formulas > Define Name  ตั้งชื่อแทนการใช้ Name Box ก็ได้

สมมติว่า ต้องการตั้งชื่อเซลล์ A1 ว่า Target ให้คลิกที่เซลล์ A1 ก่อนจากนั้นพิมพ์คำว่า Target ลงไปในช่อง Name Box แล้วกด Enter รับชื่อลงไป

image012

หรือใช้วิธีตั้งชื่อผ่านเมนู Formulas > Define Name

image013

หลักการตั้งชื่อ Range Name ที่ดี ให้ใช้ตัวอักษรภาษาอังกฤษตัวใหญ่ผสมตัวเล็ก อย่าใช้ตัวใหญ่ทั้งหมดหรือตัวเล็กทั้งหมด ถ้าอยากจะแทรกตัวเลขลงไปในชื่อก็ได้ เพียงแต่ต้องใช้ตัวอักษรเป็นตัวแรกในชื่อก่อน ส่วนชื่อที่ตั้งนั้นควรตั้งให้สื่อถึงความหมายตรงกับเรื่องที่เราต้องการ และพยายามอย่าตั้งชื่อที่อาจซ้ำกับชื่อที่ใช้เรียกภายใน Excel หรือ VBE เช่น Sheet, Cell, Range, AB123 เป็นต้น

วิธีนำชื่อ Range Name มาใช้ใน VBE

ถ้าใช้ Macro Recorder ให้บันทึกเริ่มจากคลิกเข้าไปหาแฟ้มที่ต้องการให้ได้ก่อน จากนั้นให้กดปุ่ม F5 แล้วดับเบิลคลิกชื่อที่ต้องการ จะได้รหัส VBA

Windows("Book1.xls").Activate
Application.Goto Reference:="Target"
ActiveCell.FormulaR1C1 = "123"

ถ้าเขียนรหัสเอง ให้ใช้ Target แทนลงไปในส่วนของชื่อชีทและตำแหน่งเซลล์ ดังนี้

Windows("Book1.xls").Activate
Range("Target") = 123

หมายเหตุ แม้จะใช้ Range Name ช่วยทำให้รหัส VBA ยืดหยุ่นตามการเปลี่ยนแปลงใน Excel ได้แล้วก็ตาม แต่ยังจำเป็นต้องใช้คำสั่ง Windows("Book1.xls").Activate พาไปยังแฟ้มที่มี Range Name ชื่อ Target ก่อนเสมอ หรือถ้าไม่ต้องการใส่บรรทัดนี้ เราต้องเตรียมให้แฟ้ม Book1.xls เป็นแฟ้มที่กำลังถูกเลือกใช้งานไว้ก่อน จากนั้นจึงจะใช้คำสั่งเพียง Range("Target") = 123 เพราะ VBE จะตามหา Range Name ชื่อ Target ได้จากแฟ้มที่มีชื่อ Target ตั้งไว้แล้วเท่านั้น

Select Case testexpression
    [Case expressionlist-n
        [statements-n]] ...
    [Case Else
        [elsestatements]]
End Select

ตัวอย่างที่ 1

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

  • ถ้า Source มีค่าเท่ากับ 100 พอดี ให้เลือกชุดคำสั่งชื่อ SendData1 ทำงาน
  • ถ้า Source มีค่าไม่เท่ากับ 100 ให้เลือกชุดคำสั่งชื่อ SendData2 ทำงาน

If [Source] = 100 Then SendData1 Else SendData2

หรือ

If [Source] = 100 Then
    SendData1
Else
    SendData2
End If
หรือ

Select Case [Source]
    Case 100
        SendData1
    Case Else
        SendData2
End Select

ตัวอย่างที่ 2

ขอใช้ค่าจาก Source เช่นเดียวกับตัวอย่างแรก เพียงแต่แทนที่จะตรวจสอบว่า Source มีค่าเท่ากับ 100 หรือไม่เท่านั้น คราวนี้ให้เปรียบเทียบค่า Source ต่อไปอย่างละเอียดดังนี้

  • ถ้า Source มีค่ามากกว่า 100 ให้เลือกชุดคำสั่งชื่อ SendData1a ทำงาน
  • ถ้า Source มีค่ามากกว่า 80 ให้เลือกชุดคำสั่งชื่อ SendData1b ทำงาน
  • ถ้า Source มีค่ามากกว่า 60 ให้เลือกชุดคำสั่งชื่อ SendData1c ทำงาน
  • ถ้า Source มีค่ามากกว่า 40 ให้เลือกชุดคำสั่งชื่อ SendData1d ทำงาน
  • ถ้า Source มีค่ามากกว่า 20 ให้เลือกชุดคำสั่งชื่อ SendData1e ทำงาน
  • ถ้า Source มีค่าอื่นๆ ให้เลือกชุดคำสั่งชื่อ SendData2 ทำงาน

ในกรณีที่มีเงื่อนไขซับซ้อนมากขึ้นนี้ ถ้าจะใช้ If...Then...Else Statements จะต้องเขียน ElseIf ซ้อนกันหลายชั้น แต่เนื่องจากทุกเงื่อนไขที่ใช้นั้น ใช้ค่าจาก Source เดียวกันตลอด จึงน่าเลือกใช้ Select Case Statement จะเขียนได้ง่าย มีโครงสร้างที่ชัดเจน และช่วยให้ย้อนกลับมาแก้ไขได้สะดวกกว่า

Select Case [Source]
    Case Is > 100
        SendData1a
    Case Is > 80
        SendData1b
    Case Is > 60
        SendData1c
    Case Is > 40
        SendData1d
    Case Is > 20
        SendData1e
    Case Else
        SendData2
End Select

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

ลองพิจารณารหัสที่ได้จากการใช้ Macro Recorder บันทึกการไล่คลิกหาแฟ้ม ต่อด้วยคลิกหาชีท แล้วคลิกหาเซลล์ที่ต้องการพิมพ์เลข 123 ลงไป

Windows("Book1.xls").Activate
Sheets("Sheet1").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "123"

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

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

Workbooks("Book1.xls").
Worksheets("Sheet1").Range("A1") = 123

ขอให้สังเกตว่า รหัสที่ได้จาก Recorder และรหัสที่เขียนเองนี้ แม้จะทำให้ได้ค่า 123 ใส่ลงไปในเซลล์ A1 ได้เช่นเดียวกันก็ตาม แต่รหัสที่เขียนเองจะช่วยส่งเลข 123 ลงไปในเซลล์ A1 ให้โดยไม่จำเป็นต้องย้ายไปเลือกเซลล์ A1 ส่งผลให้ Excel ทำงานได้เร็วขึ้นด้วย เนื่องจากไม่ต้องเสียเวลาเลือกเซลล์ซึ่งเกิดจากคำสั่ง Select

  • โครงสร้างแบบสั้นบรรทัดเดียว
    If condition Then [statements] [Else elsestatements]
  • โครงสร้างแบบหลายบรรทัด
    If condition Then
        [statements]
        [ElseIf condition-n Then
            [elseifstatements] ...
            [Else
            [elsestatements]]
    End If

โครงสร้างที่เห็นนี้นำมาจาก VBA Help โดยพิมพ์คำว่า If ลงไปในพื้นที่ที่ใช้พิมพ์รหัสตามปกติ แล้วกดปุ่ม F1 จะพบคำอธิบายวิธีใช้ If โดยขอให้สังเกตจากโครงสร้างว่า ส่วนใดที่เขียนไว้ภายในเครื่องหมายวงเล็บ [ ] ถือว่า เป็นส่วนที่จะเขียนหรือไม่ก็ได้ ส่วนที่เขียนด้วยตัวเข้มหนา เป็นส่วนที่ต้องเขียนเสมอ ดังนั้นโครงสร้างข้างต้น จึงมีส่วนที่จำเป็นต้องใช้ทั่วไปเพียงดังนี้

  • กรณีใช้ตัดสินใจเฉพาะ True

    If condition Then statements
    หรือ
    If condition Then
        statements
    End If
  • กรณีใช้ตัดสินใจทั้ง True และ False

    If condition Then statements Else elsestatements
    หรือ
    If condition Then
        statements
        else
        elsestatements
    End If

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

ดังนั้นแทนที่จะต้องเสียเวลาปรับระบบของ Excel ให้ถูกใจ เรามาใช้ Macro Recorder บันทึกรหัสเพื่อทำหน้าที่ปรับระบบให้ทันทีเมื่อเปิดแฟ้มขึ้นมาดีกว่า พอเปิดแฟ้มขึ้นมา ก็ให้ระบบปรับตัวเองทันที และเมื่อปิดแฟ้มก็ให้ปรับระบบกลับสู่สภาพแรกสุด เหมือนสมัยที่เพิ่งเปิดใช้ Excel เป็นครั้งแรก

วิธีใช้ Macro Recorder ต่อไปนี้ มีข้อสำคัญอยู่ที่ชื่อของ Macro ว่าต้องตั้งชื่อว่า Auto_Open และ Auto_Close เท่านั้น ห้ามตั้งชื่อเป็นอย่างอื่น โดย Auto_Open จะถูกสั่งให้ทำงานเองทันทีเมื่อแฟ้มที่เก็บรหัสนี้ถูกเปิดขึ้น และ Auto_Close จะถูกสั่งให้ทำงานทันทีเมื่อแฟ้มที่เก็บรหัสนี้ถูกสั่งปิด

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

ขั้นตอนการบันทึก Macro ชื่อ Auto_Open

สมมติ เราต้องการปรับหน้าจอของแฟ้มที่เปิดขึ้นมาให้ดูเหมือนกระดาษทำการ หาทางทำให้ไม่มีลักษณะใดที่จะบ่งบอกว่าเป็นตารางพื้นที่ Worksheet ทั้งนี้อาจใช้กับการเสนอผลงาน Presentation หรือใช้กับงานทั่วไปที่ต้องการปิดบังไม่ให้ผู้ใช้ Excel สงสัยหรือรู้ว่า หน้าจอที่เปิดขึ้นนั้นเป็นตาราง Excel

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

เริ่มต้นบันทึก Macro โดยกำหนดชื่อ Macro Name : Auto_Open และเลือกใช้ Ctrl+q หรือใช้ปุ่มอื่นก็ได้เป็น Shortcut Key แล้วบันทึกขั้นตอนคำสั่งต่อไปนี้

  1. สั่ง Formulas > Calculation Options > กาช่อง Manual
  2. สั่ง View > ตัดกาช่อง Gridlines เพื่อตัดเส้นตาราง
  3. สั่ง View > ตัดกาช่อง Headings เพื่อตัดหัวตารางที่บอกว่าเป็น row และ column ใด
  4. สั่ง View > ตัดกาช่อง Formula Bar เพื่อช่องใส่สูตร
  5. สั่ง View > Full Screen เพื่อตัดเมนูทิ้ง ขยายพื้นที่แสดงตาราง
  6. กดปุ่ม Esc เพื่อย้อนกลับมาสู่จอตามขนาดเดิมจะได้กดปุ่ม Stop ได้

 ในชุดคำสั่งที่เกิดขึ้น ให้ตัดคำสั่งสุดท้ายทิ้งโดยทำให้เป็น Comment

Sub Auto_Open()

'

' Auto_Open Macro

'

' Keyboard Shortcut: Ctrl+q

'

    Application.Calculation = xlManual

    Application.DisplayFormulaBar = False

    ActiveWindow.DisplayHeadings = False

    ActiveWindow.DisplayGridlines = False

    Application.DisplayFullScreen = True

‘    Application.DisplayFullScreen = False กำหนดคำสั่งนี้ให้เป็น comment

End Sub

เมื่อสั่งให้ Auto_Open ทำงาน จะปรับระบบการคำนวณเป็น Manual และหน้าจอให้ดูเหมือนกระดาษ

image010

ขั้นตอนการบันทึก Macro ชื่อ Auto_Close

ขั้นตอนที่ใช้บันทึก Macro ในชื่อ Auto_Close นั้น จำง่ายๆว่า ทำตามขั้นตอนของ Auto_Open เพียงแต่ให้ทำตรงกันข้ามให้หมด (หรือจะเพิ่มคำสั่งอื่นก็ได้ที่เห็นว่า ควรปรับระบบของ Excel ให้เหมาะกับงานทั่วไป)

ก่อนจะเริ่มบันทึก Macro ให้กดปุ่ม Esc เพื่อแสดงเมนูให้เห็น เมื่อบันทึกให้กำหนดชื่อ Macro Name : Auto_Close และเลือกใช้ Ctrl+w หรือใช้ปุ่มอื่นก็ได้เป็น Shortcut Key แล้วบันทึกขั้นตอนคำสั่งต่อไปนี้

  1. สั่ง Formulas > Calculation Options > กาช่อง Automatic
  2. สั่ง View > กาช่อง Gridlines เพื่อตัดเส้นตาราง
  3. สั่ง View > กาช่อง Headings เพื่อตัดหัวตารางที่บอกว่าเป็น row และ column ใด
  4. สั่ง View > กาช่อง Formula Bar เพื่อช่องใส่สูตร

ให้แก้ชุดคำสั่งที่เกิดขึ้น โดยลอกคำสั่ง Application.DisplayFullScreen = False มาใส่เพิ่ม

Sub Auto_Close()

'

' Auto_Close Macro

'

' Keyboard Shortcut: Ctrl+w

'

    Application.DisplayFullScreen = False   ‘ลอกมาใส่เพิ่ม

    Application.Calculation = xlAutomatic

    Application.DisplayFormulaBar = True

    ActiveWindow.DisplayHeadings = True

    ActiveWindow.DisplayGridlines = True   

End Sub

เมื่อสั่งให้ Auto_Close ทำงาน จะปรับระบบการคำนวณเป็น Automatic และหน้าจอกลับสู่สภาพเดิม

image011

ทดลองแก้ไขรหัสให้ทำงานกลับไปกลับมาทุกครั้งที่สั่งให้ทำงาน

ขอให้สังเกตรหัสที่ได้จากการบันทึก Macro ข้างต้น จะเห็นว่าใช้คำสั่งให้เท่ากับ True หรือ False เพื่อสั่งให้ทำหรือไม่ทำตาม ซึ่งหมายถึงสั่งให้ทำตรงกันข้ามกับสถานะเดิม ดังนั้นเราจึงสามารถใช้รหัสคำสั่งต่อไปนี้ เพื่อปรับการแสดง Full Screen ให้กลับไปซ่อนเมนูแล้วกลับมาตามเดิมได้ โดยใช้คำสั่งบรรทัดเดียวและใช้รหัส NOT ช่วยให้ทำงานกลับกัน ดังนี้

Sub ReverseFullScreen()
Application.DisplayFullScreen = Not Application.DisplayFullScreen
End Sub

ทุกครั้งที่รหัสคำสั่งชุดนี้ทำงาน จะปรับหน้าจอให้ตรงกันข้ามกับสถานะเดิม เช่น ถ้าเดิมไม่ได้เป็น Full Screen พอใช้คำสั่งนี้จะกลายเป็น Full Screen แต่ถ้าสั่งซ้ำอีกครั้งจะกลับเป็นสภาพเดิมที่ไม่ได้เป็น Full Screen

ถ้าเราต้องคอยควบคุมการทำงานของชุดคำสั่งทั้งหมด ตั้งแต่ต้นจนจบด้วยตนเอง คงเสียเวลาและเป็นเรื่องน่าเบื่อมิใช่น้อย ยิ่งมีขั้นตอนสลับซับซ้อนมากขึ้นเท่าใด ยิ่งต้องคอยให้ความใส่ใจ ใช้ความระมัดระวังในการตัดสินใจเลือกสั่ง run macro ชุดคำสั่งที่ถูกต้อง เพราะเมื่อสั่งให้ macro ทำงานไปแล้ว ไม่มีทางที่จะสั่ง undo เหมือนกับที่ใช้คำสั่งบนเมนู ให้งานที่ทำไปแล้วคืนกลับสู่สภาพเดิมได้อีก

แทนที่จะต้องคอยตัดสินใจควบคุมการทำงานของ macro ในทุกขั้นตอนด้วยตนเอง เราสามารถใช้รหัส VBA ต่อไปนี้ช่วยตัดสินใจเลือกสั่งงานแทน

  1. If...Then...Else Statements เหมาะสำหรับใช้ตัดสินใจเลือกขั้นตอนง่ายๆ หรือมีเงื่อนไขและใช้ตัวแปรซับซ้อนต่อเนื่องกันหลายชั้น
  2. Select Case Statements เหมาะสำหรับใช้ตัดสินใจได้แทนแบบ If เพียงแต่แบบ Select Case มีโครงสร้างที่ง่ายต่อการนำตัวแปรตัวเดิมไปใช้เปรียบเทียบ

ข้อควรระวัง

ในชุดคำสั่งแบบ Sub Procedure โปรดเลือกใช้รหัส If...Then...Else หรือ Select Case ช่วยเฉพาะการตัดสินใจควบคุมการสั่งงานของชุดคำสั่ง โดยพยายามหลีกเลี่ยง อย่านำไปใช้ในการเขียนรหัสคำนวณ หรือกำหนดค่าคงที่ใดๆลงไปใน VBE ทั้งนี้เพื่อช่วยให้ไม่ต้องย้อนกลับมาแก้ไขในตัวรหัสอีกในภายหลัง

ถ้าจำเป็นต้องใช้ผลลัพธ์จากการคำนวณ ควรใช้ Excel คำนวณแทน แล้วใช้ Range Name ส่งผลลัพธ์ที่คำนวณได้กลับมาใช้ตัดสินใจต่อใน VBE

ขั้นที่ 1 : ตัวอย่างนี้ต้องเปิดแฟ้มใหม่ขึ้นอีกแฟ้มหนึ่ง เพื่อใช้เก็บรหัสที่ได้จากการบันทึกการปิดแฟ้ม โดยมีขั้นตอนใช้ Recorder บันทึก ดังนี้

  1. คลิกเมนู View > Switch Windows > เลือกชื่อแฟ้มที่ต้องการปิด สมมติว่าชื่อ MyMonth.xls
  2. คลิกเมนู File > Close

จะเกิดรหัส VBA :

Windows("MyMonth.xls").Activate
ActiveWorkbook.Close

ขั้นที่ 2 : ให้ copy รหัสเฉพาะ ActiveWorkbook.Close มาสร้าง Sub Procedure ลงใน MyMonth.xls

Sub CloseMyFile()
    ActiveWorkbook.Close
End Sub

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

ขั้นที่ 3 : ถ้าอยากใช้คำสั่งปิดแฟ้ม โดยไม่ต้องถามเรื่องการจัดเก็บข้อมูลใหม่ คราวนี้ต้องศึกษาจาก Help โดยให้คลิกที่รหัสคำว่า Close จากนั้นกดปุ่ม F1 จะมีตัวอย่างแสดงไว้ในคำอธิบายของ Help ดังนี้

Workbooks("BOOK1.XLS").Close SaveChanges:=False

ขั้นที่ 4 : กลับไปแก้ไขรหัสเดิม โดยนำคำว่า SaveChanges:=False ไปเพิ่มต่อท้ายรหัสเดิม จะพบว่าคราวนี้ไม่มีคำเตือนเปิดขึ้นบนจอว่า คุณต้องการจัดเก็บข้อมูลที่เปลี่ยนแปลงหรือไม่

Sub CloseMyFile()
    ActiveWorkbook.Close SaveChanges:=False
End Sub

หมายเหตุ : หากศึกษาคำอธิบายจาก Help จะพบว่า คำสั่ง Close นั้น สามารถเขียนอีกรูปแบบหนึ่ง คือ expression.Close(SaveChanges, Filename, RouteWorkbook) โดยใช้วงเล็บกำหนดตัวเลือกต่อๆกันไป ทำให้รหัสสั้นลงเป็น

Sub CloseMyFile()
    ActiveWorkbook.Close(False)
End Sub

ตัวอย่างรหัสต่อไปนี้แทบทั้งหมด เป็นตัวอย่างซึ่งได้จาก VBE Help โดยใช้คำว่า Name ในการค้นหา

  • Worksheets(1).Visible = False
    ซ่อนชีทแรก
     
  • Worksheets("Sheet1").Protect password:="forall"
    ป้องกันชีทชื่อ Sheet1 โดยใช้รหัสว่า forall
     
  • Worksheets("Sheet1").Activate
    เลือกชีทชื่อ Sheet1
     
  • ActiveSheet.PrintOut
    สั่งพิมพ์ชีทที่กำลังใช้งานอยู่
     
  • Worksheets("Sheet1").Range("A1").Value = 100
    ส่งเลข 100 ลงไปในเซลล์ A1 ของชีทชื่อ Sheet1
     
  • Range("A1:H8").Formula = "=Rand()"
    สร้างสูตร =Rand() ลงไปในเซลล์ A1:H8 ของชีทที่กำลังใช้งานอยู่
     
  • Worksheets(1).Range("Criteria").ClearContents
    ลบข้อมูลในพื้นที่ที่มีชื่อ Range Name ว่า Criteria
     
  • Worksheets(1).Cells(1, 1).Value = 24
    ส่งเลข 24 ลงไปในชีทแรก ณ ตำแหน่งเซลล์ที่อยู่ที่ row ที่ 1 ตัดกับ column ที่ 1 ของพื้นที่ในชีทแรก ซึ่งหมายถึงเซลล์ A1
     
  • ActiveSheet.Cells(2, 1).Formula = "=Sum(B1:B5)"
    สร้างสูตร =Sum(B1:B5) ลงไปในเซลล์ A2 ของชีทที่กำลังใช้งานอยู่
     
  • Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"
    สร้างสูตร =Rand() ลงไปในเซลล์ C5 ของชีทแรก (C5 คือ เซลล์ที่อยู่ในตำแหน่ง row ที่ 1 ตัดกับ column ที่ 1 ของพื้นที่ C5:C10)
     
  • Selection.Offset(3, 1).Range("A1").Select
    เลือกเซลล์ที่อยู่ถัดจากเซลล์ที่กำลังเลือกอยู่ ห่างลงไป 3 row และ ถัดไปด้านขวา 1 column (รหัสแบบ Offset นี้จะเรียกเซลล์ที่ต้องการว่า Range("A1") เสมอ) ดังนั้นถ้าเดิมอยู่ในเซลล์ A1 พอสั่งให้รหัสบรรทัดนี้ทำงาน จะเลือกเซลล์ B4
     
  • Range("MyData")(4)=100
    ส่งเลข 100 ลงไปในเซลล์ที่ 4 ในพื้นที่ตารางที่มี Range Name ชื่อ MyData โดยเซลล์ที่ 4 นี้จะนับจากซ้ายไปขวาแล้วนับต่อลงไปยัง row ถัดลงไป แล้วนับต่อจากซ้ายไปขวาในพื้นที่ MyData
     
  • Range("MyData")(1,3)=100
    ส่งเลข 100 ลงไปในเซลล์ที่อยู่ ณ ตำแหน่ง row ที่ 1 ตัดกับ column ที่ 3 ในพื้นที่ตารางที่มี Range Name ชื่อ MyData

ตัวอย่างนี้ต้องการให้รหัสทำงานคล้ายกับตัวอย่างแรก เพียงแต่คราวนี้ให้เปลี่ยนชื่อแฟ้มแทนที่จะเป็นชื่อชีท

ขั้นที่ 1 : ขอให้ลองเขียนรหัสเองขึ้นมา โดยเลียนแบบตัวอย่างแรก

Sub RenameWorkbook()
    ActiveWorkbook.Name = Range("A1")
End Sub

เมื่อสั่ง Run จะพบว่ารหัสชุดนี้ไม่ทำงาน โดยมีคำเตือนว่า Compile error ในขั้นนี้ไม่ต้องสนใจว่า Compile error คืออะไร เพียงขอให้สังเกตว่า รหัสไม่ทำงาน แสดงว่าต้องมีอะไรที่ผิดพลาด และถ้าสังเกตต่อให้ดีจะพบว่าเมื่อคลิก OK ออกจากคำเตือน Compile error แล้ว VBE จะเลือกคำว่า .Name ไว้ เป็นอาการที่ชี้ให้เราเห็นว่า ส่วนที่ผิดพลาดน่าจะเป็นส่วนของคำว่า .Name นี่เอง

image009

ทุกครั้งที่รหัสไม่ทำงาน ให้คลิกปุ่ม Reset ซึ่งเป็นปุ่มสี่เหลี่ยมบนเมนูก่อน มิฉะนั้นจะทำอย่างอื่นต่อไม่ได้เลย

ขั้นที่ 2 : ใช้ Recorder บันทึกการสั่ง File > Save as เป็นชื่อแฟ้มใหม่ สมมติให้ใช้ชื่อว่า MyMonth.xls จะได้รหัส VBA :

ActiveWorkbook.SaveAs Filename:= _
"C:\MyMonth.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False _
, CreateBackup:=False

ขั้นที่ 3 : ทดลองตัดรหัสในขั้นที่ 2 ให้สั้นลงเหลือเท่าที่ตรงกับการจัดเก็บแฟ้มตามชื่อที่ต้องการ แล้วทดสอบว่ารหัสใหม่นี้ทำงานได้หรือไม่ ซึ่งจะพบว่ารหัสทำงาน เพียงแต่จะถูกถามว่า ต้องการให้ต้องการจัดเก็บในชื่อนี้หรือไม่ เพราะมีแฟ้มชื่อนี้อยู่แล้ว

ActiveWorkbook.SaveAs Filename:="MyMonth.xls"

ขั้นที่ 4 : ย้อนกลับไปแก้รหัสในขั้นที่ 1 แล้วจะพบว่ารหัสทำงานได้ตามต้องการ

Sub RenameWorkbook()
    ActiveWorkbook.SaveAs Filename: = Range("A1")
End Sub

รหัส VBA ที่ใช้กันมากที่สุด เห็นจะเป็นรหัสที่เกี่ยวข้องกับการเรียกใช้พื้นที่ในตาราง Excel นี่แหละ ทั้งนี้เพื่อทำให้เราสามารถจัดการกับตัวแฟ้ม ชีท row column หรือเซลล์ ได้ตามต้องการ และแทนที่จะพึ่งรหัสซึ่งเกิดขึ้นจากการใช้ Macro Recorder ทางเดียว เราควรฝึกเขียนรหัส VBA ขึ้นมาใช้เองบ้าง เพราะแทนที่จะต้องใช้รหัสที่ได้จากการบันทึก เพื่อเลือกแฟ้ม แล้วเลือกชีท แล้วเลือกเซลล์ทีละขั้น เราสามารถใช้รหัสที่เขียนขึ้น พาลัดไปยังเซลล์ที่ต้องการได้โดยตรง

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

Worksheets("Sheet1").Range("A1").Select
หรือ
Sheets("Sheet1").Range("A1").Select

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

  • รหัสคำว่า Worksheets หมายถึง ตัวชีททั้งหมดหรือกลุ่มของชีท ซึ่งต้องลงท้ายด้วย s (เรียกว่าเป็น Collection ของชีท) โดยคำว่า Worksheets ยังหมายถึง ชีทที่เป็นตารางเท่านั้น (ถ้าอยากเรียกชีททั่วไป จะใช้คำว่า Sheets ซึ่งหมายรวมทั้ง Worksheet และ Chart sheet)
  • คำว่า "Sheet1" เป็นชื่อชีท ที่เราต้องการเลือกออกมาจากชีททั้งหมดใน Worksheets ซึ่งในกลุ่มของชีทอาจมีหลายชีท ดังนั้น เราต้องระบุชื่อชีทที่ต้องการให้ถูกต้องชัดเจน
  • Worksheets("Sheet1") จึงหมายถึง ชีทชื่อ Sheet1 ซึ่งเป็นชีทหนึ่งในชีททั้งหมดที่เป็นตาราง แต่ถ้าใช้ Sheets("Sheet1") จะหมายถึง ชีทชื่อ Sheet1 ซึ่งไม่จำเป็นต้องเป็นชีทที่เป็นตารางก็ได้

ส่วนคำว่า Select ท้ายสุด ถือว่าเป็น Method หมายถึงลักษณะอาการที่เราต้องการกระทำต่อตัว Object ดังนั้น Method Select จึงเท่ากับ สั่งให้คลิกเลือก

โดยทั่วไปในรหัสบรรทัดหนึ่งๆ รหัสเกี่ยวข้องกับ Object จะถูกเขียนไว้ซ้ายสุด ต่อด้วยเครื่องหมายจุด แล้วต่อด้วย Method แต่ถ้าต้องการระบุถึงสภาพลักษณะของ Object ที่ต้องการ จะใช้ Property เขียนเรียงต่อจาก Object เช่น

Columns("B:B").ColumnWidth = 15.5

  • Columns("B:B") เป็น Object ประเภท Column ซึ่งในที่นี้หมายถึงตัว Column B
  • ColumnWidth เป็น Property หมายถึง ความกว้างของตัว Column ซึ่งในคำสั่งบรรทัดนี้ ทำให้ Column B มีความกว้าง 15.5 pixel

Property ต่างจาก Object ตรงที่ Property ไม่มีตัวตนให้มองเห็นหรือคลิกได้บนจอ แต่จะมีลักษณะเป็นสภาพ เช่น ขนาดความสูง ความกว้าง ความยาว ความหนา สี หรือสภาวะการป้องกัน

หมายเหตุ เรื่อง Object, Property, และ Method นี้เป็นเพียงชื่อเรียกศัพท์เทคนิคที่ยกขึ้นมา เพื่อแนะนำให้ทำความรู้จักกันไว้เท่านั้น ในขั้นนี้ยังไม่จำเป็นต้องสนใจเสียเวลาค้นหาว่า สิ่งใดบ้างเป็น Property ก็ได้ ขอเพียงระลึกไว้ว่า โครงสร้างรหัสคำสั่งแต่ละบรรทัด กำหนดความสำคัญจากซ้ายไปขวา เรียงจากสิ่งใหญ่ไปย่อยต่อไปเรื่อยๆ และถ้าอยากจะรู้ว่า VBA มีรหัสเป็นอย่างไร ขอให้ทดลองใช้ Recorder นั่นแหละ เมื่อคลิกเลือกลงไปในตาราง แล้วคลิกสั่งบนเมนู ก็จะเกิดบรรทัดคำสั่ง เรียง Object, Property, Method ขึ้นจากซ้ายไปขวาให้เอง

สมมติ เดิมชีทมีชื่อว่า Sheet1 เราต้องการเปลี่ยนชื่อชีทตามค่าที่เก็บไว้ในเซลล์ A1 เช่น ถ้า A1 มีคำว่า MyJan ก็ให้รหัส VBA ทำหน้าที่เปลี่ยนชื่อชีทเป็น MyJan และถ้า A1 มีค่าใหม่ ก็ให้ชื่อชีทถูกเปลี่ยนชื่อใหม่ตามค่าในเซลล์ A1 ได้ตามต้องการ

ขั้นที่ 1 : ใช้ Recorder บันทึกการคลิกเลือกเซลล์ A1 แล้วพิมพ์คำว่า MyJan ลงไป จะได้รหัส VBA :

Range("A1").Select
ActiveCell.FormulaR1C1 = "MyJan"

ขั้นที่ 2 : ใช้ Recorder บันทึกการสั่ง Home > Format > Rename Sheet แล้วพิมพ์คำว่า MyJan ทับคำว่า Sheet1 จะได้รหัส VBA :

Sheets("Sheet1").Name = "MyJan"

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

ขั้นที่ 3 : ทดลองเขียน VBA โดยผสมรหัสทั้งสองขั้นเข้าด้วยกันเป็นดังนี้

Sub RenameSheet()
    Sheets("Sheet1").Name = Range("A1")
End Sub

ซึ่งจะพบว่ารหัสใน Sub Procedure ชื่อ RenameSheet นี้ทำงานได้เพียงครั้งเดียว เนื่องจากตัวรหัส Sheets("Sheet1").Name กำหนดไว้ว่า ให้เปลี่ยนชีทที่มีชื่อว่า Sheet1 ดังนั้นหากในแฟ้มไม่มีชีทชื่อ Sheet1 เพราะถูกเปลี่ยนชื่อชีทเป็น MyJan ไปแล้ว รหัสจึงไม่สามารถทำงานตามต้องการ

ขอให้สังเกตย้อนกลับไปดูรหัสที่ได้จากขั้นแรก จะเห็นว่ามีรหัสคำว่า ActiveCell ซึ่งมีหมายถึงเซลล์ตำแหน่งใดก็ได้ ขอเพียงแต่กำลังถูกเลือกใช้งานอยู่ จึงมีคำว่า Active นำหน้า สงสัยไหมว่าในเรื่องของชีทนั้นมี ActiveSheet ด้วยไหม คราวนี้ให้ลองใช้คำว่า ActiveSheet ค้นหาใน Help ดูจะพบคำอธิบาย ดังนี้

ActiveSheet Property

Returns an object that represents the active sheet (the sheet on top) in the active workbook or in the specified window or workbook. Returns Nothing if no sheet is active. Read-only.

Remarks

If you don’t specify an object qualifier, this property returns the active sheet in the active workbook.

If a workbook appears in more than one window, the ActiveSheet property may be different in different windows.

Example

This example displays the name of the active sheet.

MsgBox "The name of the active sheet is " & ActiveSheet.Name

ถ้าอยากอ่านคำอธิบายทีละบรรทัดก็ตามใจ แต่ส่วนสำคัญที่สุดที่ควรดูเป็นจุดแรกก็คือตัวอย่างที่แสดงไว้ จะเห็นว่ามีคำสั่ง ActiveSheet.Name ซึ่งแปลว่า ชื่อชีทของชีทที่กำลังเลือกอยู่ และน่าจะนำมาใช้แทนคำว่า Sheets("Sheet1").Name ได้

ขั้นที่ 4 : กลับไปแก้รหัสที่เขียนเองใหม่ แล้วจะพบว่ารหัสชุดนี้ทำงานได้ตลอด

Sub RenameSheet()
    ActiveSheet.Name = Range("A1")
End Sub

หมายเหตุ ถ้าค้นหาคำว่า Active จาก Help จะพบว่านอกจาก ActiveCell และ ActiveSheet แล้วยังมี ActiveWorkbook, ActiveWindow, ActiveChart, ActivePane, และ ActivePrinter ให้เลือกนำมาใช้ได้

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

ชุดคำสั่ง : SendData

image021

สิ่งที่ต้องการ

ส่งข้อมูลที่กรอกลงในเซลล์ B3:D3 ไปเก็บในตารางด้านขวา โดยพิจารณาจากรหัส Id ที่กรอกในเซลล์ B3 ถ้าเป็นรหัส Id a002 ซึ่งเป็นรหัสเก่า ให้จัดส่งข้อมูลไปบันทึกทับรายการเดิมของรหัส a002 แต่ถ้าเป็นรหัสใหม่ที่ไม่เคยมีอยู่ในตารางด้านขวา เช่น รหัส Id a004 ให้จัดส่งข้อมูลไปบันทึกต่อท้ายรายการในตารางขวา

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Source ให้กับเซลล์ B3:D3
  2. สร้าง Range Name ชื่อ Ref ให้กับเซลล์ G3
  3. สร้าง Range Name ชื่อ Id ให้กับเซลล์ G3:G10
  4. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =OFFSET( Ref,
       IF( COUNTIF( Id, $B$3 )>=1,
            MATCH( $B$3, Id, 0 )-1,
            COUNTA( $G:$G )-1),
       0, 1, 3 )

วิเคราะห์สูตร

Target
=OFFSET( Ref,
   IF( COUNTIF( Id, $B$3 )>=1,
        MATCH( $B$3, Id, 0 )-1,
        COUNTA( $G:$G )-1),
   0, 1, 3 )

ขอให้สังเกตเลข 0, 1, 3 ที่อยู่ด้านท้ายของสูตร Offset ก่อน

  • เลข 0 กำหนดตำแหน่งของข้อมูล ให้เริ่มในแนว column เดียวกันกับ Ref
  • เลข 1 คือ ความสูงของรายการข้อมูล ซึ่งต้องมีความสูงคงที่ 1 row เสมอ
  • เลข 3 คือ ความกว้างของรายการ ซึ่งประกอบด้วย Id, Name, Amount จึงกำหนดให้กว้าง 3 column คงที่

ส่วนของสูตร IF( COUNTIF(Id,$B$3)>=1, MATCH($B$3,Id,0)-1, COUNTA($G:$G)-1)

  • COUNTIF(Id,$B$3) ทำหน้าที่นับจำนวนรายการที่มี Id ที่กรอกใน B3
  • ถ้า COUNTIF(Id,$B$3)>=1 เป็นจริง แสดงว่ามีรหัสรายการบันทึกอยู่แล้ว จึงให้ส่งข้อมูลไปบันทึกทับรายการเดิม ณ ตำแหน่งที่คำนวณจาก MATCH($B$3,Id,0)-1
  • ถ้า COUNTIF(Id,$B$3)>=1 เป็นเท็จ แสดงว่าเป็นรหัส Id ของรายการใหม่ จึงให้ส่งข้อมูลไปบันทึกต่อท้ายรายการเดิม ณ ตำแหน่งที่คำนวณจาก COUNTA($G:$G)-1

โปรดสังเกตว่า สูตร IF ที่ใช้นี้เป็นสูตรที่อยู่ใน Excel จึงช่วยให้ไม่ต้องเสียเวลากลับไปแก้ไขรหัส VBA เลยแม้แต่น้อย  

คนที่เพิ่งเริ่มฝึกใช้ VBA หรือแม้แต่คนที่ใช้ VBA มานาน มักติดปัญหาตรงที่ไม่รู้ว่า รหัสคำสั่ง VBA ที่ตนต้องนำมาใช้นั้นเป็นอย่างไร บางคนสามารถเปิดตำราค้นหารหัสได้แล้ว แต่ไม่รู้ว่าจะดัดแปลงรหัสอย่างไรได้บ้าง ครั้นติดปัญหา ไม่สามารถแก้ไขทำต่อด้วยตนเอง ก็จะยกปัญหาขึ้นถามบนเว็บ พอได้คำตอบไปใช้งานสักพัก ต่อมาไม่นานก็กลับมาถามหารหัสต่อจากคำถามเดิมซ้ำแล้วซ้ำอีก

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

ในบทนี้จะแนะนำวิธีใช้ Macro Recorder ช่วยในการเรียนรู้ VBA จะได้ทำตนให้เป็นที่พึ่งของตนเสียก่อน

แทนที่จะส่งข้อมูลใหม่ไปต่อท้ายรายการทั้งหมดที่มีอยู่เดิม คราวนี้จะหาทางส่งข้อมูลไปแก้รายการเก่า (ถ้ามี)

ชุดคำสั่ง : SendData

image020

สิ่งที่ต้องการ

ส่งข้อมูลที่กรอกลงในเซลล์ B3:D3 กลับไปแก้ไขรายการเก่า โดยใช้ค่าที่กรอกนั้น ส่งไปทับรายการเดิมที่มีอยู่แล้วในตารางด้านขวา เช่น จากภาพ ให้ส่งรายการ a002 ที่ใช้ชื่อใหม่ว่า boy ไปแก้ไขรายการ a002 เดิมซึ่งใช้ชื่อว่า b ให้เป็น boy

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Source ให้กับเซลล์ B3:D3
  2. สร้าง Range Name ชื่อ Ref ให้กับเซลล์ G3
  3. สร้าง Range Name ชื่อ Id ให้กับเซลล์ G3:G10
  4. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =OFFSET( Ref, MATCH( $B$3, Id, 0)-1, 0, 1, 3)

วิเคราะห์สูตร

Target
=OFFSET( Ref, MATCH( $B$3, Id, 0)-1, 0, 1, 3)

ขอให้สังเกตเลข 0, 1, 3 ที่อยู่ด้านท้ายของสูตร Offset ก่อน

  • เลข 0 กำหนดตำแหน่งของข้อมูล ให้เริ่มในแนว column เดียวกันกับ Ref
  • เลข 1 คือ ความสูงของรายการข้อมูล ซึ่งต้องมีความสูงคงที่ 1 row เสมอ
  • เลข 3 คือ ความกว้างของรายการ ซึ่งประกอบด้วย Id, Name, Amount จึงกำหนดให้กว้าง 3 column คงที่

ส่วนของสูตร MATCH( $B$3, Id, 0)-1 เป็นตัวช่วยกำหนดตำแหน่งรายการเดิมว่า Id ที่กรอกในเซลล์ B3 เป็นตำแหน่งลำดับที่เท่าใดใน Range ชื่อ Id สาเหตุที่ต้องลบผลที่ได้จากสูตร Match ออกเสีย 1 ตำแหน่ง ทั้งนี้เพื่อให้ตรงกับจำนวน row ที่ต้องนับถัดไปจากตำแหน่งของเซลล์ Ref

ดังนั้นสูตร Offset นี้ จึงทำหน้าที่ส่งรายการข้อมูลที่กรอกไว้ในตารางที่มีความสูง 1 rowและกว้าง 3 column จาก Range Name ชื่อ Source ไปยัง Target ซึ่งมีขนาดความสูงและความกว้างเดียวกัน เพียงแต่ Target จะขยับไปหาตำแหน่งรายการเดิมซึ่งอยู่ถัดไปจาก Ref ตามที่นับได้ด้วยสูตร Match-1

ตัวอย่างนี้จะเกิด error ขึ้นทันที ถ้ารหัสที่กรอกลงไปในเซลล์ B3 ไม่ใช่รหัส Id ที่บันทึกเก็บไว้แล้วในตารางด้านขวา ดังนั้นถ้าต้องการป้องกันไม่ให้ชุดคำสั่ง SendData หยุดทำงานกลางคัน ให้แก้ชุดคำสั่งเล็กน้อยเป็นดังนี้

Sub SendData()
    On Error Resume Next
    MyVar = [Source]
    [Target] = MyVar
End Sub

On Error Resume Next ที่ใส่เพิ่มเป็นบรรทัดแรก จะทำหน้าที่ตรงกับความหมาย ซึ่งแปลว่า "เมื่อเกิด error ขึ้น ให้กลับไปทำงานต่อ" ทำให้ชุดคำสั่ง SendData จะไม่เตือน error ให้เห็นอีกเลยแม้รหัสบรรทัดต่อๆไปจะไม่ทำงานก็ตาม

แทนที่จะใช้ On Error Resume Next ซึ่งไม่ได้ช่วยแก้ไขข้อมูลและไม่ได้เตือนให้ผู้ใช้ทราบว่าเกิดปัญหาแต่อย่างใด เราสามารถใช้ On Error Goto แทนดังนี้

Sub SendData()
    On Error GoTo ResetInput
    MyVar = [Source]
    [Target] = MyVar
    End
ResetInput:
    [Source] = "Invalid"
End Sub

On Error Goto ทำหน้าที่ตรงกับคำแปล คือ "เมื่อเกิด error ขึ้นให้ไปทำงานที่อื่นต่อ" ซึ่งในตัวอย่างนี้ กำหนดให้ข้ามไปทำงานต่อที่บรรทัด ResetInput โดยทำหน้าที่เปลี่ยนข้อมูลใน Source เป็นคำว่า Invalid เพื่อเตือนให้ทราบว่า ข้อมูลที่กรอกนั้นไม่ถูกต้อง

สังเกตว่าบรรทัด ResetInput: ต้องมีเครื่องหมาย colon : ต่อท้าย และนิยมเขียนโดยไม่จัดย่อหน้า

นอกจากนั้น ในกรณีที่ไม่เกิด error เราต้องป้องกันไม่ให้ชุดคำสั่งนี้ ทำงานในส่วนตั้งแต่บรรทัด ResetInput: จึงต้องใช้คำสั่ง End ไว้ก่อน เพื่อทำให้รหัสคำสั่งทำงานตามปกติ และจบไปเลย โดยไม่สนใจกับรหัสคำสั่งบรรทัดที่เหลือ

ในการบันทึก Macro แต่ละครั้ง ขอให้บันทึกขั้นตอนทำงานสั้นๆ พยายามบันทึกขั้นตอนให้สั้นที่สุด เพื่อทำให้เกิดรหัสแต่ละงานถูกบันทึกเป็น Sub Procedure แยกออกจากกัน ช่วยทำให้เราสามารถเรียนรู้และแก้ไขรหัสได้ง่าย ต่อเมื่อผ่านการทดลองทดสอบแล้วว่า รหัสทั้งหมดสามารถทำงานได้ตามต้องการ จึงนำชื่อ Sub Procedure ที่ได้นั้นมาเขียนตามลำดับที่ใช้งาน รวมไว้ใน Sub Procedure ชุดใหม่ เพื่อช่วยทำให้เราสามารถสั่งงานเพียงครั้งเดียว แล้วรหัสทั้งหมดจะทำงานต่อเนื่องกันให้เอง

ตัวอย่างเช่น เดิมมี Sub Procedure ที่เกิดจากการบันทึก 3 ครั้ง ตั้งชื่อ Macro Name ไว้ว่า MyWork1, MyWork2, และ MyWork3

ให้เขียน Sub Procedure ใหม่เพื่อรวมคำสั่งเดิมทั้ง 3 ชุดมาไว้ที่เดียวกัน ตามแบบดังนี้

Sub RunAllMyWorks()
    MyWork1
    MyWork2
    MyWork3
End Sub

ตัวอย่างนี้น่าจะช่วยแก้ปัญหาให้กับงานได้มากมายหลายประเภท ซึ่งต้องการกรอกข้อมูลลงไปในเซลล์ แล้วต้องการนำข้อมูลที่กรอกไว้ไปเก็บต่อท้ายข้อมูลที่มีอยู่แล้ว ทำให้เกิดเป็นตารางฐานข้อมูลในที่สุด

ชุดคำสั่ง : SendData

image019

สิ่งที่ต้องการ

ส่งข้อมูลที่กรอกลงในเซลล์ B3:D3 ไปเก็บต่อท้ายรายการในตารางด้านขวา

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Source ให้กับเซลล์ B3:D3
  2. สร้าง Range Name ชื่อ Ref ให้กับเซลล์ G3
  3. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =OFFSET( Ref, COUNTA($G:$G)-1, 0, 1, 3 )

วิเคราะห์สูตร

Target
=OFFSET( Ref, COUNTA($G:$G)-1, 0, 1, 3 )

ขอให้สังเกตเลข 0, 1, 3 ที่อยู่ด้านท้ายของสูตร Offset ก่อน

  • เลข 0 กำหนดตำแหน่งของข้อมูล ให้เริ่มในแนว column เดียวกันกับ Ref
  • เลข 1 คือ ความสูงของรายการข้อมูล ซึ่งต้องมีความสูงคงที่ 1 row เสมอ
  • เลข 3 คือ ความกว้างของรายการ ซึ่งประกอบด้วย Id, Name, Amount จึงกำหนดให้กว้าง 3 column คงที่

ส่วนของสูตร COUNTA($G:$G)-1 เป็นตัวช่วยกำหนดตำแหน่งรายการใหม่ต่อท้ายรายการเดิม โดย COUNTA($G:$G) จะนับจำนวนเซลล์ที่มีข้อมูลใน column G ทั้งหมด แต่เนื่องจากนับเซลล์คำว่า Id รวมเกินมา 1 เซลล์ จึงต้องลบ COUNTA($G:$G) ออกเสีย 1 ตำแหน่ง ทั้งนี้เพื่อให้ตรงกับจำนวน row ที่ต้องนับให้ถัดไปจากตำแหน่งของเซลล์ Ref

ดังนั้นสูตร Offset นี้ จึงทำหน้าที่ส่งรายการข้อมูลที่กรอกไว้ในตารางที่มีความสูง 1 rowและกว้าง 3 column จาก Range Name ชื่อ Source ไปยัง Target ซึ่งมีขนาดความสูงและความกว้างเดียวกัน เพียงแต่ Target จะขยับไปหาตำแหน่งรายการถัดไปจาก Ref ตามที่นับได้ด้วยสูตร CountA-1

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

image007

ตามตัวอย่างข้างต้น หากต้องการใช้ VBA เลือกพื้นที่ตั้งแต่เซลล์ที่มีเลข 11 จนถึงเซลล์ที่มีเลข 88 ให้ใช้เมนู Formulas > Define Name ตั้งชื่อ Range A1:D2 สมมติว่าใช้ชื่อ Range Name ว่า MyData

จากนั้นให้ใช้ Macro Recorder บันทึกการกดปุ่ม F5 แล้วเลือกชื่อ Range Name ชื่อ MyData ที่แสดงขึ้น จะทำให้เกิดรหัส VBA ดังนี้

Application.Goto Reference:="MyData"

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

ตัวอย่างที่ผ่านมาเป็นการรับส่งข้อมูลเพียงเซลล์เดียว ซึ่งสามารถเลือกใช้สูตร Index หรือ Offset ก็ได้ แต่ถ้าต้องการรับส่งข้อมูลจากตารางที่มีขนาดตั้งแต่ 2 เซลล์ขึ้นไป ต้องเลือกใช้สูตร Offset แบบเต็ม เพราะสูตร Offset นี้เท่านั้นที่สามารถกำหนดส่วนของความสูงและความกว้างของตาราง

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

ชุดคำสั่ง : SendData

image018

สิ่งที่ต้องการ

ส่งข้อมูลเท่าที่มีอยู่จากตารางด้านซ้ายไปเก็บไว้ในตารางด้านขวา ซึ่งจำนวนรายการข้อมูลที่มีนั้นอาจเพิ่มหรือลดก็ได้

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Ref1 ให้กับเซลล์ B3
  2. สร้าง Range Name ชื่อ Ref2 ให้กับเซลล์ G3
  3. สร้าง Formula Name ชื่อ Source ให้เป็นสูตร
    =OFFSET( Ref1, 0, 0, COUNTA($B:$B)-1, 3 )
  4. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =OFFSET( Ref2, 0, 0, COUNTA($B:$B)-1, 3 )

วิเคราะห์สูตร

Source
=OFFSET( Ref1, 0, 0, COUNTA($B:$B)-1, 3 )

Target
=OFFSET( Ref2, 0, 0, COUNTA($B:$B)-1, 3 )

เนื่องจากตำแหน่งเซลล์หัวมุมของตารางทั้งคู่ อยู่ตรงกับตำแหน่งของ Ref1 และ Ref2 ดังนั้นจึงกำหนดตำแหน่ง row และ column ถัดไป เท่ากับ 0

สูตรทั้งคู่กำหนดค่าความสูงเท่ากับ COUNTA($B:$B)-1 โดยใช้ข้อมูลใน column ของ Id เป็นหลักในการนับ แต่เนื่องจากมีเซลล์คำว่า Id อยู่ใน column นี้ด้วย จึงต้องลบ 1 ออกจาก COUNTA($B:$B) ส่วนความกว้างของตาราง กำหนดให้มีขนาดคงที่เท่ากับ 3 column

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

นอกจากนั้นข้อมูล Id ต้องบันทึกในเซลล์ติดต่อกันไป (ห้ามเว้นเซลล์ว่างไว้) และห้ามบันทึกค่าอื่นในเซลล์ใดๆบน column B ที่ไม่เกี่ยวข้องกับรหัส เพราะจะทำให้สูตร CountA นับจำนวนรายการผิด ส่งผลให้ค่าความสูงที่ส่งต่อไปใช้ในสูตร Offset ผิดพลาดตามไปด้วย

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

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

image007

ก่อนที่จะเริ่มบันทึก Macro ขอให้คลิกเลือกเซลล์ A1 ไว้ก่อนจากนั้นจึงเริ่มบันทึก Macro ตามการใช้แป้นพิมพ์ได้หลายวิธี

วิธีที่ 1 กดปุ่ม Ctrl+* เพื่อเลือก Current Region รหัส VBA ที่เกิดขึ้นคือ

Selection.CurrentRegion.Select

วิธีที่ 2 ต้องบันทึก 2 ขั้นตอน

  1. กดปุ่ม Ctrl+Shift+ลูกศรขวา พร้อมกัน จากนั้น
  2. กดปุ่ม Ctrl+Shift+ลูกศรชี้ลง พร้อมกัน

Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

วิธีที่ 3 ต้องใช้แป้นพิมพ์เลือกทีละเซลล์จากขวามาซ้าย ตามด้วยจากบนมาล่าง

  1. กดปุ่ม Shift พร้อมกับกดปุ่มลูกศรขวา 3 ครั้ง
  2. กดปุ่ม Shift พร้อมกับกดปุ่มลูกศรลง 1 ครั้ง

Range("A1:D2").Select

วิธีที่ 4 กดปุ่ม Ctrl+Shift+End เพื่อเลือกจนถึงเซลล์ขวาล่างสุดของตาราง

Range(Selection, _
ActiveCell.SpecialCells(xlLastCell)).Select

วิธีที่ 5 วิธีนี้ใช้หลักเลือกย้อนจากล่างขึ้นบน

  1. กดปุ่ม F5 ไปเลือกเซลล์ D65536 บรรทัดล่างสุดของตาราง
  2. กดปุ่ม End แล้วตามด้วยปุ่มลูกศรชี้ขึ้น เพื่อเลือกเซลล์ D2
  3. กดปุ่ม Ctrl+Shift พร้อมกับปุ่ม Home เพื่อเลือกย้อนกลับมาเซลล์ A1

Application.Goto Reference:="R65536C4"
Selection.End(xlUp).Select
Range(Selection, Cells(1)).Select

ทั้ง 5 วิธีสามารถใช้เลือกพื้นที่ตารางจากเซลล์ A1:D2 คือ เซลล์ที่มีเลข 11 จนถึงเซลล์ที่มีเลข 88 ได้เหมือนกัน แต่วิธีที่ยืดหยุ่นคือวิธีที่ 5 วิธีเดียวเท่านั้น เพราะสามารถนำมาใช้เลือกพื้นที่ จากเซลล์ที่มีเลข 11 จนถึงเซลล์ที่มีเลข 88 ได้เหมือนเดิม แม้ว่าตารางจะมีลักษณะเปลี่ยนไป ไม่ได้มีข้อมูลในเซลล์ติดต่อกันเช่นเดิม

image008

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

ตัวอย่างนี้คล้ายกับตัวอย่างที่ใช้สูตร Index แต่เลือกใช้สูตร Offset แทน เพื่อทำให้ส่งค่าไปยังเซลล์ใดก็ได้ ไม่ต้องจำกัดขอบเขต

ชุดคำสั่ง : SendData

image017

สิ่งที่ต้องการ

ส่งตัวเลข 777 หรือค่าใดๆที่บันทึกไว้ในเซลล์ B4 ไปเก็บไว้ในตาราง โดยใช้ตำแหน่งอ้างอิงจากเซลล์ D1 ว่า เซลล์ที่ต้องการรับข้อมูล อยู่ห่างจากเซลล์ D1 เป็นระยะทาง 5 row และห่าง 2 column

ขั้นตอนการสร้างงาน

  1. สร้าง Range Name ชื่อ Source ให้กับเซลล์ B4
  2. สร้าง Range Name ชื่อ Ref ให้กับเซลล์ D1
  3. สร้าง Formula Name ชื่อ Target ให้เป็นสูตร
    =OFFSET( Ref, $B$2, $B$3 )

วิเคราะห์สูตร

Target
=OFFSET( Ref, $B$2, $B$3 )

สูตรนี้ทำงานคล้ายกับ Index เพียงแต่กำหนดตำแหน่ง Row และ Column ถัดไปจากตำแหน่งเซลล์ชื่อ Ref ซึ่งตำแหน่ง Row และ Column นี้เป็นได้ทั้งค่าบวก ลบ และศูนย์ (ถ้าตำแหน่งอยู่เหนือเซลล์ Ref หรืออยู่ด้านซ้ายเซลล์ Ref ให้กำหนดเป็นเลขลบ)

เมื่อกำหนดตำแหน่ง Row และ Column ลงไปในเซลล์ B2 และ B3 ตามลำดับ จะส่งผลให้ข้อมูลจาก Source ส่งไปที่ MyVar ต่อไปยัง Target แล้วสูตร Offset จะเป็นตัวกำหนดตำแหน่ง Row และ Column ของเซลล์ที่รับค่าในที่สุด

ตัวอย่างนี้ แม้จะไม่จำกัดขอบเขตว่าต้องอยู่ภายในตารางที่กำหนด แต่อย่างไรก็ตามยังต้องอยู่ภายในชีท จึงต้องระวังตัวเลขตำแหน่งเซลล์ว่า อย่าใช้ตำแหน่งที่เป็นไปไม่ได้ เช่น กำหนดค่า B2 เป็นเลข -100 ซึ่งย้อนขึ้นไปด้านบนเหนือ row ที่ 1 เสียอีก

เมื่อใดที่คลิกลงไปในชีทหรือเซลล์ เมื่อนั้น Macro Recorder จะสร้างรหัส VBA ที่ระบุชื่อชีทหรือตำแหน่งเซลล์ตายตัว เช่น หากต้องการควบคุมให้บันทึกเลข 123 ลงไปที่เซลล์ A5 ของ Sheet3 ให้เลือกเซลล์ที่อยู่ในชีทอื่นก่อน จากนั้นให้เริ่มบันทึก Macro โดยคลิกเลือก Sheet3 แล้วคลิกเซลล์ A5 พิมพ์เลข 123 ลงไปแล้วกด Enter ซึ่งจะเกิดรหัส VBA ซึ่งจะทำงาน ณ ตำแหน่งเซลล์เดิมของชีทชื่อเดิมด้วยเท่านั้น

Sheets("Sheet3").Select
Range("A5").Select
ActiveCell.FormulaR1C1 = "123"

ตัวอย่างนี้หากใช้วิธีที่ไม่คลิก โดยให้คลิกเลือกเซลล์ A5 ไว้ก่อน แล้วเริ่มบันทึก Macro เพียงขั้นเดียว โดยพิมพ์เลข 123 ลงไปแล้วกด Enter จะเกิดรหัสซึ่งสามารถนำไปใช้ต่อได้กับทุกตำแหน่งเซลล์

ActiveCell.FormulaR1C1 = "123"

 

About Excel Expert Training

 

  

Excel Expert Training จัดอบรม Excel มานานตั้งแต่ปีพ.ศ. 2539
โดยอาจารย์สมเกียรติ ฟุ้งเกียรติ ซึ่งเป็นผู้เชี่ยวชาญ Excel ระดับแนวหน้าของประเทศ
เป็น Microsoft Excel MVP คนแรกของไทยและเอเชียตะวันออกเฉียงใต้ ที่ได้รางวัลนี้นานกว่า 10 ปี

ตั้งแต่ปีพ.ศ. 2542 ได้สร้างเว็บ Excel Expert Training นี้
เพื่ออุทิศตนให้ความรู้ฟรีแก่สังคมเรื่อยมา

อีกทั้งยังเคยเป็นวิทยากรให้กับสมาคมส่งเสริมเทคโนโลยี (ไทย-ญี่ปุ่น) กว่า 18 ปี
เป็นวิทยากรให้กับบริษัทปูนซิเมนต์ไทย จำกัด (มหาชน) กว่า 5 ปี
นี่คือหลักฐานแห่งความมั่นใจในคุณภาพ

Excel Expert Training มุ่งจัดอบรมให้มีคุณภาพสูงสุด รับผู้เข้าอบรมไม่เกิน 6 คนต่อรอบเท่านั้น
คุณสามารถเลือกอบรมแบบ Public หรือแบบ Private ซึ่งคุณสามารถ
กำหนดเนื้อหาที่ต้องการอบรมได้เอง และนัดอบรมในวันและเวลาที่สะดวก


Excel-logo-icon 90bw

 

xlroom850
ห้องฝึกอบรม Excel Expert Training

EETLogo wTableSML

EETEmailPhone

 

 

 

EETSmart01

Go to top