บทที่ 9 ข้อผิดพลาดในโปรแกรม


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

1. ข้อผิดพลาดประเภท Compile Error ที่พบบ่อย
1.ข้อผิดพลาดที่เกิดจากการกำหนดชนิดตัวแปรผิด หรือไม่เหมาะสม

รูปที่ 9.1
ตัวอย่างเช่น ตัวแปร x เป็นชนิด String แต่ตัวแปร y เป็นชนิด Integer ซึ่งไม่สามารถนำมาคูณกันได้
Private Sub CommandButton1_Click()
Dim a As String
Dim x As String
Dim y As Integer
x = TextBox1.Text
y = TextBox2.Text
a = x*y
Label3.Caption = a
End Sub
2.ความผิดพลาดที่เกิดจากการไม่กำหนดตัวแปร หรืออาจพิมพ์ชนิดตัวแปรผิด

รูปที่ 9.2
ตัวอย่างเช่น ตัวแปร a ประกาศตัวแปรแบบ String แต่ผู้เขียนโปรแกรมอาจพิมพ์ผิด
Private Sub CommandButton1_Click()
Dim a As Strin
Dim x As Integer
Dim y As Integer
x = TextBox1.Text
y = TextBox2.Text
a = x*y
Label3.Caption = a
End Sub
3. ข้อผิดพลาดที่เกิดจากการใช้บล็อค If ไม่มีคำสั่ง End If ปิดท้าย

รูปที่ 9.3

4.โปรแกรมไม่มี End Sub ที่ส่วนท้ายสุดของโปรแกรม

รูปที่ 9.4

5.ข้อผิดพลาดที่เกิดจากการไม่มี Method หรือ Property หรืออาจจะพิมพ์ผิด

รูปที่ 9.5
ตัวอย่างเช่น TextBox2 ใช้คุณสมบัติ Text เพื่อส่งค่าคืนให้ y แต่ชื่อคุณสมบัติพิมพ์ผิดเป็น Tex ซึ่งตัว t หายไป
Private Sub CommandButton1_Click()
Dim a As String
Dim x As Integer
Dim y As Integer
x = TextBox1.Text
y = TextBox2.Tex
a = x*y
Label3.Caption = a
End Sub

6. ข้อผิดพลาดที่เกิดจากการพิมพ์ผิดหรือใช้สัญลักษณ์ผิด

รูปที่ 9.6
Private Sub CommandButton1_Click()
Dim a, x, y As Integer
x = TextBox1.Text
y = TextBox2.Tex
a = x*y
Label3,Caption = a
End Sub

 
2. ข้อผิดพลาดประเภท Run-time Error ที่พบบ่อย
1. Run-time error ‘6’ Overflow ข้อผิดพลาดที่เกิดจากค่าส่งคืนมีค่ามากกว่าชนิดของตัวแปรที่กำหนด

รูปที่ 9.7
Private Sub CommandButton1_Click()
Dim a, x, y As Integer
x = TextBox1.Text
y = TextBox2.Tex
a = x*y
Label3.Caption = a
End Sub
จากตัวอย่างจะเห็นว่าค่าตัวแปรทั้งหมดกำหนดให้เป็นชนิด Integer ซึ่งมีค่าอยู่ระหว่าง -32,768 ถึง 32,767 นั้นหมายความว่า ถ้ากำหนดค่าให้ตัวแปรมากกว่าหรือน้อยกว่านี้ หรือผลของการคูณ x และ y มากกว่าหรือน้อยกว่าค่าจำกัดของ Integer ก็จะเกิดไดอะล็อกแสดงข้อความ Overflow ขึ้นมา

2. Run-time error ‘11’ ข้อผิดพลาดที่เกิดจากการหารค่าด้วย “0”

รูปที่ 9.8
Private Sub CommandButton1_Click()
Dim a As String
Dim x As Integer
Dim y As Integer
x = TextBox1.Text
y = TextBox2.Text
a = x / y
Label3.Caption = a
End Sub
3. Run-time error ‘13’ Type mismatch ข้อผิดพลาดที่เกิดจากการพิมพ์ค่าตัวแปรผิด
ตัวอย่างเช่น มีฟอร์มให้ผู้ใช้กรอกข้อมูลเป็นตัวเลข 9X10 =90 แต่ผู้ใช้กรอกข้อมูลเป็นตัวอักษร 9X1o(อักษรตัว โอ) ทำให้ไม่สามารถคำนวนได้

                                      รูปที่ 9.9                                             

รูปที่ 9.10
3. Run-time error’424’ Object required ข้อผิดพลาดที่เกิดจาก โปรแกรมไม่มี Object หรืออาจพิมพ์ชื่อ Object อาจพิมพ์ผิด

รูปที่ 9.11
ตัวอย่างเช่น TextBox2 เป็นอ๊อปเจค ที่ผู้เขียนโปรแกรมสร้างไว้บนฟอร์ม แต่เวลาลงรหัสคำสั่งพิมพ์เป็น TextBox ซึ่งเลข 2 หายไป ทำให้โปรแกรมหาอ๊อปเจคไม่พบ
Private Sub CommandButton1_Click()
Dim a As String
Dim x As Integer
Dim y As Integer
x = TextBox1.Text
y = TextBox.Text
a = x*y
Label3.Caption = a
End Sub

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

On Error Resume Next   หากเกิดข้อผิดพลาดเกิดขึ้นใน procedure ให้โปรแกรมสามารถดำเนินการในคำสั่ง statement ต่อไป
On Error GoTo 0  หากเกิดข้อผิดพลาดเกิดขึ้นใน procedure ให้โปรแกรมสามารถดำเนินการในคำสั่ง statement ต่อไป ตามตำแหน่งอ้างอิง
On Error GoTo line     หากเกิดข้อผิดพลาดเกิดขึ้นใน procedure ให้โปรแกรมสามารถดำเนินการในคำสั่ง statement บันทัดที่