Font s :
Background :

VBA กับการตัดสินใจ

ถ้าเราต้องคอยควบคุมการทำงานของชุดคำสั่งทั้งหมด ตั้งแต่ต้นจนจบด้วยตนเอง คงเสียเวลาและเป็นเรื่องน่าเบื่อมิใช่น้อย ยิ่งมีขั้นตอนสลับซับซ้อนมากขึ้นเท่าใด ยิ่งต้องคอยให้ความใส่ใจ ใช้ความระมัดระวังในการตัดสินใจเลือกสั่ง 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

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 เปิดจอเล็กๆไล่ลำดับชื่อสูตรที่มีอยู่้ เพื่อให้เลือกได้โดยตรงในขณะที่พิมพ์ให้ทันที

 

 

Categories

About this Entry

This page contains a single entry by สมเกียรติ ฟุ้งเกียรติ published on November 13, 2006 2:44 PM.

วิธีเรียกใช้รหัสเกี่ยวกับตาราง Excel was the previous entry in this blog.

วิธีสร้างสัญญาณเตือน...ภัย is the next entry in this blog.

Find recent content on the main index.

Font s :
Background :