วันจันทร์ที่ 15 กรกฎาคม พ.ศ. 2556

การวนซ้ำคำนวณ หรือการวน Loop ใน VBA

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

วันนี้จะเขียนเกี่ยวกับ การกระทำที่วนซ้ำหลายๆรอบด้วยชุดคำสั่งเพื่อการวนซ้ำโดยเฉพาะที่อยู่ใน VBA ต่อไปจำเรียกการวนซ้ำว่าวนลูป (Loop) นะครับ ขออนุญาตทับศัพท์ไปเลย ว่า วนซ้ำ= Loop


ชุดคำสั่งเพื่อการวนซ้ำใน VBA จะมี 3 แบบ นะครับคือ
1) For....Next
2) Do....Loop Until
3) Do....Loop While

1. การวนลูปด้วย For....Next
     การวนลูปแบบนี้เหมาะสำหรับกรณีที่เรารู้จำนวนของการวนรอบซ้ำที่ชัดเจน เช่น ต้องการวน 10 ครั้ง หรือ 100 ครั้ง เป็นต้น และจะต้องมีตัวแปรสำหรับการวนรอบแต่ละครั้งด้วย ที่นิยมใช้ก็มีเช่น ตัวแปร i , j หรือ k แต่อาจจะตั้งชื่อตัวแปรการวนซ้ำได้เองตามต้องการนะครับ มาดูตัวอย่างการใช้งานกัน...

รูปแบบของชุดคำสั่ง 
For V = M to N
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด For กับ Next)
     ...
Next

เมื่อ
  • คำว่า For และ Next เป็นคำบังคับที่ต้องมี
  • V เป็นชื่อตัวแปรสำหรับการวนลูป จะมีค่าเปลี่ยนไปในแต่ะรอบ ส่วนใหญ่(ถ้ามักไม่ค่อยคิดอะไรมาก)   ก็ใช้ตัว i, j หรือ k หรืออาจตั้งชือเป็นตัวอื่นตามที่ต้องการเช่น nLoop หรือ num เป็นต้น ในแต่ละรอบของการวนลูปค่า V จะเปลี่ยนไปทีละ 1
  • M เป็นตัวเลข เริ่มต้นของตัวแปร V ในการวนลูปครั้งแรก (โดยทั่วไปมักำหนดเท่ากับ 1 แต่เริ่มที่จำนวนเต็มอื่นก็ได้)
  • N เป็นตัวเลขสุดท้ายของตัวแปร V ในลูปสุดท้ายของการทำงาน ถ้ากำหนด M มีค่าเป็น 1 N ก็จะเป็นจำนวนรอบของการวนลูปพอดี


ตัวอย่างที่ 1 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ For....Next

Sub summation()
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     For i = 1 to 10    'เริ่มการวนลูป ในที่นี้ ตัว V หรือตัวแปรที่ใช้ในการวนลูปแต่ละรอบคือ ตัวแปร i มีค่า                                   'เริ่มจาก 1 เพิ่มขึ้นทีละ 1 ในแต่ละรอบจนถึงค่าสุดท้ายคือ 10 ก็หยุด

         sum=sum+i     'เป็นการกระทำที่อยู่ในลูปคือให้เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่
                               'ตัวแปร sum เหมือนเดิม

     Next i                 'จบการทำงานของลูปในหนึ่งรอบ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

อธิบายโปรแกรม
  ในบันทัด For ค่า i จะถูกกำหนดโดยคนเขียนให้มีค่เป็น 1 ในการทำงานครั้งแรกของการวนซ้ำ แล้วโปรแกรมจะตรวจสอบค่า i กับตัวเลขที่อยู่หลัง to ว่า i มีค่าเกิน ค่านี้หรือยัง ถ้ายังก็ให้ทำงานในคำสั่งที่อยู่ในลูป ถ้าเกินแล้วก็ไม่ต้องทำอะไร แล้วให้เลิกวนลูป แล้วข้ามไปทำคำสั่งหลังจากบรรทัด Next

ลูปที่ 1 (i มีค่าเป็น 1) --> sum + i จะมีค่าเป็น 0+1 ซึ่งมีค่าเป็น 1 แล้วบันทึกค่าเก็บไว้ที่ sum อีกครั้ง (ตอนนี้ sum มีค่าเป็น 1) แล้ว พอมาถึงบรรทัด Next มันก็จะไม่วิ่งไปข้างล่าง แต่จะวิ่งขึ้นไปที่คำสั่ง For อีกครั้ง

ลูปที่ 2 เมื่อมา For เป็นครั้งที่ 2 มันจะกำหนดค่า i ให้มีค่ามากกว่าเดิมอยู่ 1   i มีค่าเดิมเป็น 1 ดังนั้นในรอบที่ 2 นี้ i จะมีค่าเป็น 1+1=2 เอง(โดยที่เราไม่ต้องไปสั่งมันทำ) ถัดมาบรรทัดต่อไป ก็จะเอาค่า sum+i (ตอนนี้ sum มีค่า 1 และ i มีค่า 2) ดังนั้น sum+i =1+2=3 แล้วไปเก็บไว้ที่ตัวแปร sum อีกที (sum เก็บค่า=3) แล้วไปบรรทัด Next

ลูปที่ 3 i จะมีค่าเป็น 3 อัตโนมัติ ดังนั้น sum+i = 3+3=6
ลูปที่ 4 i จะมีค่าเป็น 4 อันโนมัติ ดังนั้น sum+i= 6+4=10
ลูปที่ 5 i จะมีค่าเป็น 5 อัตโนมัติ ดังนั้น sum+i = 10+5=15
ลูปที่ 6 i จะมีค่าเป็น 6 อันโนมัติ ดังนั้น sum+i= 15+6=21
ลูปที่ 7 i จะมีค่าเป็น 7 อัตโนมัติ ดังนั้น sum+i = 21+7=28
ลูปที่ 8 i จะมีค่าเป็น 8 อันโนมัติ ดังนั้น sum+i= 28+8=36
ลูปที่ 9 i จะมีค่าเป็น 9 อัตโนมัติ ดังนั้น sum+i = 36+9=45
ลูปที่ 10 i จะมีค่าเป็น 10 อันโนมัติ ดังนั้น sum+i= 45+10=55
ลูปที่ 11 i จะมีค่าเป็น 11 ซึ่งเกินตัวเลขที่เรากำหนดไว้หลัง to (คือค่า 10) โปรแกรมจะไม่ทำคำสั่งในลูป แล้วจะหลุดออกจากการวนซ้ำไปทำคำสั่งที่อยู่ถัดจากบรรทัด Next เลย ในที่นี้คือ  Msgbox(sum) ซึ่งก็คือแสดงค่า sum ออกมาในรูปของกล่องโต้ตอบ ก็จบโปรแกรม [อ่านการใช้งานคำสั่ง Msgbox ได้ที่ http://thaiexcelvba.blogspot.com/2012/01/msgbox-excel-vba.html ]

2. การวนลูปด้วย Do....Loop Until
     การวนซ้ำแบบนี้มักจะใช้กับกรณีที่รู้เงื่อนไขการหยุดการวนซ็ำอย่างชัดเจน ซึ่งอาจรู้หรือ ไม่รู้ จำนวนรอบของการวนซ้ำก็ได้ แต่ถ้ารู้จำนวนการวนซ้ำให้ใช้ For.....Next จะสะดวกกว่าครับ การทำงานของการวนซ้ำแบบนี้จะไม่มีตัวแปรในการวนแต่ละลูป ถ้าจะใช้ต้องกำหนดเข้ไปเอาเอง

รูปแบบของชุดคำสั่ง 
Do 
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด Do กับ Loop)
     ...
Loop Until ...(C หรือ เงื่อนไขจบลูป)


เมื่อ
  • คำว่า Do และ Loop Until เป็นคำบังคับที่ต้องมี
  • C เป็นเงื่อนไขสำหรับตัดสินว่าจะจบการวนซ้ำเมื่อไหร่ เช่น  i >10  เป็นต้น 
ตัวอย่างที่ 2 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ Do....Loop

Sub summation()
     i = 0                   'กำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวนซ้ำ
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     Do                     'เริ่มการวนลูป  
         i = i+1            'กำหนดค่าตัวแปรที่ใช้ในการคำนวณในแต่ละลูปเอง โดยให้มีค่าเพิ่มขึ้น 1
         sum=sum+i     'เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่ ตัวแปร sum เหมือนเดิม
     Loop Until i >9   'เงื่อนไขการจบการวนซ้ำ คือให้ทำวนซ้ำไปเรื่อยๆจนค่า i >9 ถึงหยุดวนซ้ำ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

ข้อสังเกตุ
1. การทำงานแบบวนซ้ำจะเริ่มที่บรรทัด Do ถึงบรรทัด Loop เท่านั้น
2. แต่ละรอบจะไม่มีตัวแปรในการวนซ้ำให้มา ต้องกำหนดเอาเอง เช่น i = i+1 ซึ่งอาจกำหนดเป็นอย่าง         อื่นก็ได้ตามความต้องการเช่น i = 5+i ก็ได้เป็นต้น
3. ในการวนซ้ำรอบสุดท้าย ก็คือเงื่อนไขที่กำหนดให้หยุดเป็นจริงครั้งแรก (เช่นที่ i มีค่าเป็น 10) โปรแกรมจะวนซ้ำขึ้นไปทำงานอีก 1 รอบแล้วออกจากการวนซ้ำ (นี่จึงใช้เงื่อนไขจบเป็น i >9  ถ้าใช้ i >10 ก็จะได้การวนซ้ำเพิ่มอีกหนึ่งรอบคือที่ i=11 มาด้วยซึ่งได้คำตอบเป็น sum=66)

3. การวนลูปด้วย Do....Loop While
     การวนซ้ำแบบนี้จะคล้ายๆกับ Do ...Loop Until คือมักจะใช้กับกรณีที่รู้เงื่อนไขการหยุดการวนซ็ำอย่างชัดเจน ซึ่งอาจรู้หรือ ไม่รู้ จำนวนรอบของการวนซ้ำก็ได้ แต่ถ้ารู้จำนวนการวนซ้ำให้ใช้ For.....Next จะสะดวกกว่าครับ ข้อแตกต่างระหว่าง Do...Loop Until กับ Do Loop While ก็คือ สำหรับ  Do Loop While มักจะใช้เงื่อนไขการจบที่เหตุการณ์หนึ่งไม่เป็นจริง (พูดอีกนัยหนึ่งคือให้วนซ้ำไปเรื่อยๆหากเงื่อนไขการวนซ้ำยังเป็นจริงอยู่ และหยุดวนซ้ำเมื่อเหตุการณ์นั้นไม่เป็นจริงต่อไป) การทำงานของการวนซ้ำแบบนี้จะไม่มีตัวแปรในการวนแต่ละลูป ถ้าจะใช้ต้องกำหนดเข้ไปเอาเอง

รูปแบบของชุดคำสั่ง 
Do 
     ...
     (แทรกชุดคำสั่งสำหรับในแต่ละรอบตรงนี้- ระหว่างบรรทัด Do กับ Loop)
     ...
Loop While ...(C หรือ เงื่อนไขจบลูป)


เมื่อ
  • คำว่า Do และ Loop Whileเป็นคำบังคับที่ต้องมี
  • C เป็นเงื่อนไขสำหรับตัดสินว่าจะจบการวนซ้ำเมื่อไหร่ เช่น  i <10  เป็นต้น 
ตัวอย่างที่ 3 ต้องการหาผลลัพท์ของ 1+2+3+4+5+6+7+8+9+10 โดยใช้การวนลูปแบบ Do..Loop While

Sub summation()
     i = 0                   'กำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวนซ้ำ
     sum=0                'กำหนดตัวแปรชื่อ sum ที่จะใช้เป็นคำตอบของโจทก์นี้ให้มีค่าเป็น 0 ก่อนเริ่มวนลูป
     Do                     'เริ่มการวนลูป  
          i = i+1            'กำหนดค่าตัวแปรที่ใช้ในการคำนวณในแต่ละลูปเอง โดยให้มีค่าเพิ่มขึ้น 1
         sum=sum+i     'เอาค่า sum บวกกับค่า i ของแต่ละรอบแล้วเก็บไว้ที่ ตัวแปร sum เหมือนเดิม 
     Loop While i<10   'เงื่อนไขการจบการวนซ้ำ คือให้ทำวนซ้ำไปเรื่อยๆจนค่า i<10 ถึงหยุดวนซ้ำ
     Msgbox(sum)     'แสดงกล่องโต้ตอบที่มีค่า sum ออกมา
End Sub

ข้อสังเกตุ
1. การทำงานแบบวนซ้ำจะเริ่มที่บรรทัด Do ถึงบรรทัด Loop While เท่านั้น
2. แต่ละรอบจะไม่มีตัวแปรในการวนซ้ำให้มา ต้องกำหนดเอาเอง เช่น i = i+1 ซึ่งอาจกำหนดเป็นอย่าง         อื่นก็ได้ตามความต้องการเช่น i = 5+i ก็ได้เป็นต้น
3. ในการวนซ้ำรอบสุดท้าย ก็คือเงื่อนไขที่กำหนดให้หยุดไม่เป็นจริงครั้งแรก (เช่นที่ i มีค่าเป็น 10) โปรแกรมจะวนซ้ำขึ้นไปทำงานอีก 1 รอบแล้วออกจากการวนซ้ำ (นี่จึงใช้เงื่อนไขจบเป็น i<10  ถ้าใช้ i <11 ก็จะได้การวนซ้ำเพิ่มอีกหนึ่งรอบคือที่ i=11 มาด้วยซึ่งได้คำตอบเป็น sum=66)


ไม่ยากเลยใช่ไหมละครับ
ขอให้สนุกกับ การวนซ้ำใน VBA นะครับ ^^