วันพฤหัสบดีที่ 15 กรกฎาคม พ.ศ. 2553

VBA Excel ตอน การทำซ้ำ Looping

บทความนี้ถูกเขียนด้วย Windows Live Writer เป็นบทความแรกครับ ต้องขอขอบคุณ http://www.hackublog.com ที่แนะนำเครื่องมือดีๆมาช่วยผมเขียนบทความได้สะดวกมากยิ่งขึ้น ขอบคุณจริงๆครับ มาเข้าเรื่องกันเลยดีกว่าครับ บทความที่ผ่านมาผมจะเน้นไปที่การประยุกต์ใช้ฟังก์ชันของ MS Excel ในการแก้ปัญหาทางวิศวกรรมเป็นหลัก ซึ่งก็แสดงให้เห็นถึงความสามารถในการช่วยคำนวณได้เป็นอย่างดี แต่ดังที่ผมได้แนะนำไปแล้วใน พื้นฐาน VBA Excel ซึ่งเป็นอีกหนึ่ง ความสามารถของ Excel นั่นคือ การกำหนด Macro เพื่อช่วยในการทำงานที่มีรูปแบบซ้ำๆกัน เรามาดูตัวอย่างที่ผมจะนำเสนอกันในบทความนี้ครับ

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

Signal

ภาพที่ 1 การจำลองการเคลื่อนที่ของวัตถุ

โดยที่ Tp คือคาบเวลาของการเคลื่อนที่มีหน่วยเป็น วินาที(s)

T คือเวลาทั้งหมดในการจำลองการเคลื่อนที่มีหน่วยเป็น วินาที (s)

Amplitude คือขนาดของการเคลื่อนที่ มีค่าสูงสุดเท่ากับ 1 ต่ำสุดเท่ากับ 0

จากการจำลองลักษณะการเคลื่อนที่ดังแสดงในภาพที่ 1 เราสามารถหาจำนวนลูกคลื่นของการเคลื่อนที่ได้จากสูตร N = T/Tp เมื่อพิจารณาลักษณะของการเคลื่อนที่ พบว่าเป็นลักษณะของรูปสามเหลี่ยม ดังนั้นในการจำลองการเคลื่อนที่ของวัตถุชิ้นนี้ในเวลา T วินาที โดยมีคาบการเคลื่อนที่เท่ากับ Tp จะต้องใช้จำนวนชุดข้อมูลสำหรับการจำลองการเคลื่อนที่เท่ากับ 2N + 1 ชุด โดย

Amplitude ที่เวลา tn ใดๆ มีค่าเท่ากับ

An = 1 หาก n เป็นจำนวนคู่

An = 0 หาก n เป็นจำนวนคี่

โดย tn คือเวลาในชุดข้อมูลที่ n หาได้จาก

tn = Tp*(n-1)/2 ; n = 1 , 2 , 3 ,….,2N+1

โดยชุดข้อมูลจะถูกกำหนดในรูปของคู่อันดับ(tn , An) ;n = 1 , 2 , 3 ,..,2N+1

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

เรามาดู ตัวอย่างการจำลองการเคลื่อนที่ของวัตถุชิ้นหนึ่งให้มีลักษณะการเคลื่อนที่ดังภาพที่ 1 โดยมีคาบเวลาในการเคลื่อนที่เท่ากับ 0.2 วินาที และวัตถุชิ้นนี้เคลื่อนที่โดยใช้เวลาทั้งหมด 6 วินาที เอาหล่ะคับมาเริ่มคำนวณกันเลย

อันดับแรกมาคำนวณจำนวนชุดข้อมูลก่อนครับจะได้ชุดข้อมูลเท่ากับ 2*6/0.2 +1 ชุด นั่นคือ 61 ชุด โอ้โห้ไม่น้อยนะครับ ผมขอเพิ่มเงื่อนไขอีกนิด เนื่องจากชุดข้อมูลเหล่านี้จะต้องถูกส่งไปยังโปรแกรมที่สาม(Third Party) ซึ่งมีข้อกำหนดว่า ในหนึ่งแถวจะต้องมีชุดข้อมูลเรียงกันเท่ากับ 4 ชุด ยกเว้นแถวสุดท้ายสามารถมีน้อยกว่า 4 ชุดได้ เอาหล่ะคับ จากข้อกำหนดนี้แสดงว่าเราต้อง บันทึกข้อมูลใน Excel ทั้งหมด 16 แถว (15 แถวแรกจะมีชุดข้อมูลแถวละ 4 ชุด แถวสุดท้ายจะมีข้อมูล 1 ชุด) และเนื่องจากการส่งชุดข้อมูลออกภายนอกนั้นชุดข้อมูลจะถูกกั้นด้วยเครื่องหมาย , ดังนั้นในการคำนวณของ Excel จะต้องบันทึกข้อมูลแต่ละชุดลงในแต่ละเซลล์โดยใน 1 ชุดข้อมูลต้องบันทึกแยก tn และ An ลงไปในแต่ละเซลล์ด้วย ดังนั้นใน 1 แถวจะต้องบันทึกผลลงไปในเซลล์ทั้งหมด 8 เซลล์ ยกเว้นแถวสุดท้ายอาจจะไม่ครบทั้งแปดเซลล์ ดังแสดงในตารางที่ 2

ตารางที่ 2 ตัวอย่างใน Worksheets ของ MS Excel

A B C D E F G H
1 t1 A1 t2 A2 t3 A3 t4 A4
2 t5 A5 t6 A6 t7 A7 t8 A8
16 t61 A61

ตรงนี้หล่ะคับที่เราต้องใช้เงื่อนไขการทำซ้ำและการตรวจสอบเงื่อนไขเพื่อให้ได้ชุดข้อมูลดังแสดงในภาพที่ 2 เอาหล่ะครับมาดูการกำหนด Macro และ ทำความเข้าใจกับ VBA Code กันครับ

  1. สร้าง Macro ชื่อ Amplitude ตามขั้นตอนที่เคยนำเสนอในบทความก่อนหน้านี้
  2. ใน Visual Basic Editor ท่านจะพบ Subrutene ชื่อ Amplitude ซึ่งเราจะทำการเขียน VBA Code สำหรับการคำนวณและกำหนดค่าการจำลองการเคลื่อนที่ลงในเซลล์ดังตารางที่ 2 โดยรายละเอียดของ VBA Code อธิบายได้ดังภาพที่ 2
  3. สร้างปุ่มกดและกำหนดป้ายชื่อเป็น Create และกำหนดมาโคร Amplitude ตามขั้นตอนที่ได้กล่าวมาในบทความที่ผ่านมา
  4. ทดสอบ macro โดยการคลิกปุ่ม Create จะได้ผลการทำงานของ macro ดังแสดงในภาพที่ 3

VBA Code

ภาพที่ 2 VBA Code (Amplitude Subrutene )

VBA Result

ภาพที่ 3 ผลการทำงานของ macro Amplitude ผ่านการคลิกปุ่ม Create

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

ในตัวอย่างนี้เป็นการแสดงการใช้เงื่อนไขการทำซ้ำและเงื่อนไขการตรวจสอบเพื่อช่วยในการคำนวณกรณีที่จำนวนข้อมูลมีเป็นจำนวนมากและลักษณะการคำนวณซ้ำๆกัน หวังว่าท่านผู้อ่านจะได้รับประโยชน์จากกรณีตัวอย่างนี้เพื่อนำไปใช้ในการแก้ปัญหาการคำนวณด้วย VBA Excel ต่อไป อ้อลืมไปครับ ท่านผู้อ่านคิดเหมือนผมมั้ยครับว่า macro นี้ยังใช้งานลำบากอยู่นิดหนึ่งครับ นั่นคือ เราต้องเข้าไปกำหนดค่า Total Time และ Time period ใน Subrutene Amplitude หากเราสามารถกำหนดค่าผ่าน Cell ใน Worksheet จะทำให้ทำงานได้สะดวกรวดเร็วกว่าเดิมครับ ลองนำไปแก้ไข VBA Code ตัวนี้ดูนะครับ

ของฝาก

VBA Data Type

ชนิดข้อมูล Integer มีช่วงในการเก็บข้อมูล –32,768 to 32,767

ชนิดข้อมูล Long มีช่วงในการเก็บข้อมูล –2,147,483,648 to 2,147,483,647

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Yahoo bot last visit powered by  Ybotvisit.com