ถ้าเราต้องคอยควบคุมการทำงานของชุดคำสั่งทั้งหมด ตั้งแต่ต้นจนจบด้วยตนเอง คงเสียเวลาและเป็นเรื่องน่าเบื่อมิใช่น้อย ยิ่งมีขั้นตอนสลับซับซ้อนมากขึ้นเท่าใด ยิ่งต้องคอยให้ความใส่ใจ ใช้ความระมัดระวังในการตัดสินใจเลือกสั่ง run macro ชุดคำสั่งที่ถูกต้อง เพราะเมื่อสั่งให้ macro ทำงานไปแล้ว ไม่มีทางที่จะสั่ง undo เหมือนกับที่ใช้คำสั่งบนเมนู ให้งานที่ทำไปแล้วคืนกลับสู่สภาพเดิมได้อีก
แทนที่จะต้องคอยตัดสินใจควบคุมการทำงานของ macro ในทุกขั้นตอนด้วยตนเอง เราสามารถใช้รหัส VBA ต่อไปนี้ช่วยตัดสินใจเลือกสั่งงานแทน
- If...Then...Else Statements เหมาะสำหรับใช้ตัดสินใจเลือกขั้นตอนง่ายๆ หรือมีเงื่อนไขและใช้ตัวแปรซับซ้อนต่อเนื่องกันหลายชั้น
- Select Case Statements เหมาะสำหรับใช้ตัดสินใจได้แทนแบบ If เพียงแต่แบบ Select Case มีโครงสร้างที่ง่ายต่อการนำตัวแปรตัวเดิมไปใช้เปรียบเทียบ
ข้อควรระวัง
ในชุดคำสั่งแบบ Sub Procedure โปรดเลือกใช้รหัส If...Then...Else หรืิอ Select Case ช่วยเฉพาะการตัดสินใจควบคุมการสั่งงานของชุดคำสั่ง โดยพยายามหลีกเลี่ยง อย่านำไปใช้ในการเขียนรหัสคำนวณ หรือกำหนดค่าคงที่ใดๆลงไปใน VBE ทั้งนี้เพื่อช่วยให้ไม่ต้องย้อนกลับมาแก้ไขในตัวรหัสอีกในภายหลัง
ถ้าจำเป็นต้องใช้ผลลัพธ์จากการคำนวณ ควรใช้ Excel คำนวณแทน แล้วใช้ Range Name ส่งผลลัพธ์ที่คำนวณได้กลับมาใช้ตัดสินใจต่อใน VBE
If...Then...Else Statements
- โครงสร้างแบบสั้นบรรทัดเดียว
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
Select Case Statement
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
IIf Function
ในกรณีที่ต้องการใช้สูตร IF ในโครงสร้างสูตรแบบเดียวกันกับที่ใช้สูตรใน Excel เราสามารถใช้สูตร IIF ใน VBA โดยมีโครงสร้างสูตร ดังนี้
IIf(expr, truepart, falsepart)
ตัวอย่าง
ถ้า Source มีค่ามากกว่า 1000 ให้ปรับค่าเหลือเท่ากับ 100
[Source] = IIF([Source] > 1000, 100, [Source])
โปรดสังเกตว่า เราใช้ IIF แบบสูตรเพื่อคำนวณหาผลลัพธ์ แต่ไม่ได้ใช้เพื่อสั่งให้รหัสคำสั่งอื่นทำงานโดยตรง ดังนั้นฝั่งซ้ายของ IIF จึงใช้เครื่องหมายเท่ากับเซลล์หรือตัวแปรที่ต้องการรับค่า
Choose Function
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")
วิธีนำสูตรของ Excel มาใช้กับ VBA
แทนที่จะต้องเริ่มต้นเรียนรู้โครงสร้างสูตรของ 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 เปิดจอเล็กๆไล่ลำดับชื่อสูตรที่มีอยู่้ เพื่อให้เลือกได้โดยตรงในขณะที่พิมพ์ให้ทันที
