...ส บ า ย ๆ ส ไ ต ล์ มื อ ไ ม่ PRO แ ถ ม ยั ง... LOWFESSIONAL ...
 
ทำ Menu บนชีทงาน ใช้โค้ดสั้นๆ และแสดงรายการตามชื่อ Workbook


|"ลุงไม้..."|123it.co.nr|เรื่องทั้งหมด|เรื่องที่แล้ว |เรื่องต่อไป|

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



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


ผมตั้งข้อกำหนดกว้างๆไว้ 2 ข้อครับ คือ

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

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



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

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

revenue.xls คืองานรับเงิน
expense.xls คืองานจ่ายเงิน
gl.xls คืองานบัญชีแยกประเภท

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



สังเกตจากชีทงานนะครับ ในคอลัมน์ "ระดับ" ผมแบ่งเมนูออกเป็น 3 ระดับ คือ

1. ระดับที่ 1 เป็นชื่อเมนู มี 2 ลักษณะ คือ
1.1 แบบไม่มีคำสั่ง ก็จะคลิกเพื่อแสดงเมนูย่อยตามปกติ
1.2 แบบมีคำสั่ง ก็จะคลิกเพื่อทำงานตามโค้ดที่กำหนดไว้ได้ก่อน
2. ระดับที่ 2 เป็นเมนูย่อยสำหรับใช้งาน มี 2 ลักษณะเช่นกัน คือ
2.1 แบบมีคำสั่ง ก็ใช้คลิกเพื่อทำงานตามคำสั่งนั้นๆตามปกติ
2.2 แบบไม่มีคำสั่ง จะใช้เป็นชื่อกลุ่มของเมนูย่อยในระดับถัดไป
3. ระดับที่ 3 เป็นเมนูย่อยจากชื่อกลุ่มในระดับที่ 2 ครับ

คอลัมน์ "เส้นคั่น" นั้น ถ้าผมใส่ - เอาไว้ นั่นก็คือจะแสดงเส้นคั่นเหนือเมนูนี้ให้ด้วยครับ

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

1. ค้นหา Column และ Row ของชื่อไฟล์ที่กำลังเปิดอยู่ ในที่นี้ก็คือ cus_list.xls, revenue.xls หรือ expense.xls นั่นเอง
2. เมื่อได้ Column และ Row ของชื่อไฟล์แล้ว ก็จะเริ่มทำงานใน Row ถัดลงไป เพื่ออ่านข้อกำหนดต่างๆไปตามลำดับของ Column
3. เมื่อไปถึง Row ที่ไม่มีข้อมูล ก็จบขั้นตอนการสร้างเมนูสำหรับชื่อไฟล์นี้

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



สาระสำคัญของโค้ดนี้ก็คือ การกำหนด aRow และ aCol เพื่อล็อคตำแหน่งที่จะอ่านค่าต่างๆนำไปสร้างเมนู ลองมาดูโค้ดต่อไป



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

สุดท้ายจะเป็นส่วนของการอ่านค่าจากชีทงานเพื่อไปสร้างเมนู ดังนี้ครับ



การทำงานของโค้ดนี้ก็คือ รับค่า Row และ Column มาจากโค้ดก่อนหน้า แล้วมารันจาก Row แรก ถึง Row ที่หมดรายการ โดยตรวจสอบที่คอลัมน์ "ระดับ" ว่าจะสร้างเมนูในลักษณะใด ตามเงื่อนไขที่กำหนดไว้ข้างต้นของบทความครับ



จะเห็นว่า โค้ดงานไม่ได้ยาวมากมายอะไรเลย เมื่อเทียบกับงานเก่าๆ(เชยๆ)ที่เคยทำไว้แต่แรก และการที่มาสร้างโครงสร้างของระบบเมนู ให้อยู่ในลักษณะของตารางบนชีทงาน ทำให้การมองภาพรวมนั้นสะดวกมากๆครับ จะแก้ไขเปลี่ยนแปลง หรือจะเพิ่มเมนูย่อย เพิ่มเมนูหลัก หรือเพิ่มชื่อไฟล์ใดๆ ก็สามารถที่จะไปสร้างไว้ตรงส่วนใหนของชีทงานก้ได้ เพียงแต่รักษาลำดับของ Row และ Column ต่างๆเอาไว้เท่านั้น สังเกตได้อย่างในโค้ด ใช้การอ้างอิงเป็น aCol, aCol+1, aCol+2 ฯลฯ จึงทำให้โค้ดมีความยืดหยุ่นมากขึ้นด้วย

ขอขอบคุณทุกๆเว็บ ทุกๆบอร์ด และทุกๆท่าน ที่แบ่งปันความรู้ ให้ผมได้เก็บเกี่ยวมาสร้างสรรค์งานต่างๆ ออกมาได้ตามสั่งของผู้บริหาร อันส่งผลให้ผมยังคงมีงานทำอยู่ได้ทุกวันนี้ครับผม...


Create Date : 10 มกราคม 2551
Last Update : 17 มกราคม 2551 20:43:02 น. 6 comments
Counter : 2573 Pageviews.  
 
 
 
 
โอว ท่าจะยากสำหรับเราแฮ่ะ.... แต่จะพยายามทำบ้างค่ะ ขอบคุณก๊าบที่แนะนำสิ่งดีๆ ให้
 
 

โดย: mamminnie วันที่: 10 มกราคม 2551 เวลา:20:37:18 น.  

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

โดย: jaya (i'm jaya ) วันที่: 10 มกราคม 2551 เวลา:22:12:17 น.  

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

เรื่อง Excel และ VBA นี้ คงจะเหมาะสำหรับท่านที่ใช้งานโดยตรงครับ แต่สำหรับท่านอื่นๆ ก็จะได้พอมองเห็นว่า เออ...มันทำแบบนี้ก็ได้ด้วย เผื่อว่าวันหน้าวันหลังมีโอกาสได้ใช้ จะได้เคยผ่านตาครับ

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

โดย: mitrapap วันที่: 11 มกราคม 2551 เวลา:9:14:29 น.  

 
 
 
ขอบคุณที่แวะไปเยี่ยมนะครับ

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

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

โดย: ครูเอก วันที่: 16 มกราคม 2551 เวลา:22:01:39 น.  

 
 
 
เป็นเรื่องที่ดีครับครูเอกครับ...

ผมเอง ก็ถือได้ว่า หลงเสน่ห์ของเอ็กเซลเข้าให้แล้ว แต่ผมไปสนุกอยู่หลังงานครับ(VBA) ส่วนครูเอกสนุกอยู่หน้างานเลย(Formula & Function)

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

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

ในกลุ่มคนทำงานที่ต้องใช้คอมใช้โปรแกรม หากถามว่า "คุณใช้โปรแกรมอะไรทำงาน?" ถ้าคำตอบเป็นชื่อโปรแกรมสักชื่อหนึ่ง ก็จะมีอะไรๆคุยกันต่ออีก แต่ถ้าตอบว่า "ผมใช้เอ็กเซล" ก็แทบจะหมดเรื่องคุยในทันที เพราะคนส่วนมากคิดว่าเอ็กเซลทำได้แค่ + - * / และ SUM เท่านั้นจริงๆ (มันทำให้ผมรู้สึกวังเวงขึ้นทันทีเหมือนกัน)

บ่นอะไรซะเรื่อยเปื่อย...เอาเป็นว่า หากงานนี้เกิดขึ้นได้จริง ผมก็ยินดีเป็นส่วนร่วมด้วยคนนึงครับผม
 
 

โดย: mitrapap วันที่: 19 มกราคม 2551 เวลา:22:53:41 น.  

 
 
 
อ๊ะมีงานเลี้ยงไม่ชวนกันเลยนะครับ...

ผมก็ชอบ excel นะครับ ชอบตรงที่มันง่าย ได้คำตอบที่ต้องการไว
ไม่ว่าจะใช้ VB หรือ Function ของ excel เอง
การใช้ formula หรือ function ของ excel ในการแก้ปัญหามันท้าท้ายดีครับ บางครั้งผมก็ชอบใช้

แต่ก็ติด vb เหมือนกันบางทีเขียนสูตร Excel หลายชั้นหลายตอน + สูตร array เข้าไปอีกกว่าจะได้คำตอบ แต่เขียน vb แค่ไม่กี่บรรทัดก็ได้คำตอบแล้ว

ก็เลยใช้ vb อยู่บ่อยครั้งเหมือนกัน (ไม่ใช่ vb ที่ซับซ้อนอะไรนะครับ แค่คำสั่ง วน loop ง่ายนี่เอง)
 
 

โดย: แดนน้อย IP: 202.91.18.205 วันที่: 6 กุมภาพันธ์ 2551 เวลา:9:24:06 น.  

Name
Opinion
*ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก

mitrapap
 
Location :
สระบุรี Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 18 คน [?]




Free Domain Names @ .co.nr!
[Add mitrapap's blog to your web]

MY VIP Friend

 
pantip.com pantipmarket.com pantown.com