Nội dung chính
1. Các loại lỗi
Có ba loại lỗi trong lập trình:
- Lỗi cú pháp.
- Lỗi runtime.
- Lỗi Logic.
Lỗi cú pháp
Các lỗi cú pháp, còn gọi là lỗi phân tích cú pháp, xuất hiện tại thời điểm biên dịch code. Ví dụ, dòng sau gây ra một lỗi cú pháp bởi vì nó thiếu một dấu đóng ngoặc ở dòng 4.
Sub ErrorHanlding_Demo1() Dim str As String str = "Hello!" y = Ucase(str End Sub
Lỗi runtime
Các lỗi runtime, còn được gọi là lỗi ngoại lệ, xảy ra trong quá trình thực thi.
Ví dụ, dòng sau gây ra lỗi runtime vì ở đây cú pháp là chính xác nhưng khi chạy nó đang cố gọi hàm fnmultiply, nhưng hàm này không tồn tại.
Sub ErrorHanlding_Demo2() Dim x As Integer Dim y As Integer x = fnadd(10, 20) y = fnmultiply(10, 20) End Sub Function fnadd(x,y) fnadd = x + y End Function
Lỗi Logic
Lỗi logic có thể là loại lỗi khó khăn nhất để theo dõi. Những lỗi này không phải là kết quả của lỗi cú pháp hoặc lỗi runtime. Thay vào đó, chúng xuất hiện khi bạn mắc lỗi trong logic khiến cho đầu ra của chương trình không nhận được kết quả mong đợi.
Ví dụ, chia một số cho số không hoặc một tập lệnh được thực thi trong vòng lặp vô hạn.
Xử lý lỗi trong VBA
Xử lý lỗi cú pháp
Trình VBA Editor trong Excel hỗ trợ xử lý lỗi cú pháp, khi biên dịch trình Editor sẽ chỉ cho bạn vị trí của những lỗi cú pháp.
Để phát hiện ra nhiều lỗi khi biên dịch hay nói cách khác là hạn chế lỗi khi runtime bạn nên:
- Khai báo biến với kiểu dữ liệu (vì VBA không yêu cầu bạn phải khai báo biến).
- Khai báo Option Explicit trình Editor bắt những lỗi cú pháp, biến không được định nghĩa và nhiều hơn thế nữa.
Ví dụ: ví dụ sau trình Editor sẽ báo lỗi biên dịch "Variable not defined" ở dòng số 6 cho bạn.
Option Explicit Sub ErrorHanlding_Demo1() Dim str As String str = "Hello!" y = UCase(str) End Sub
Xử lý lỗi runtime
Bất kỳ lỗi runtime nào xảy ra đều gây hiện tượng dừng đột ngột. Bạn có thể sử dụng câu lệnh On Error để bắt các lỗi runtime trong VBA với cú pháp như sau:
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
No. | Từ khóa & Mô tả |
---|---|
1 |
GoTo line Cho phép xử lý lỗi bắt đầu ở dòng được chỉ định. Dòng được chỉ định phải ở trong cùng một thủ tục với câu lệnh On Error. |
2 |
GoTo 0 Vô hiệu hoá xử lý lỗi đã kích hoạt trong thủ tục hiện tại và đặt lại nó thành Nothing. |
3 |
GoTo -1 Vô hiệu hóa ngoại lệ được bật trong thủ tục hiện tại và đặt lại nó thành Nothing. |
4 |
Resume Next Chỉ định rằng khi xảy ra lỗi runtime, điều khiển sẽ đi đến câu lệnh ngay sau câu lệnh nơi xảy ra lỗi và việc thực hiện vẫn tiếp tục từ thời điểm đó. |
Đối tượng Err
Đối tượng này được sử dụng để lấy ra thông tin lỗi, ví dụ Err.Number cung cấp mã số lỗi và Err.Description cung cấp cho các mô tả lỗi.
Ví dụ xử lý lỗi trong VBA
Ví dụ cho một bảng tính, tính căn bậc hai của các giá trị của cell A1 đến A5 và điền vào cell B1 đến B5 tương ứng.
Option Explicit Public Const COL_A = "A" Public Const COL_B = "B" Sub ErrorHanlding_Demo() Dim i As Integer On Error GoTo InvalidValue: For i = 1 To 5 Cells(i, COL_B).Value = Sqr(Cells(i, COL_A).Value) Next i Exit Sub InvalidValue: MsgBox "Error: " & Err.number & " : " & Err.Description Resume Next End Sub
Kết quả:
Click Square Root button: có 2 lỗi được bắt và show ra như sau:
Lỗi 1: không thể tính căn bậc hai của số âm.
Lỗi 2: kiểu dữ liệu không phù hợp.
Kết quả tính căn bậc hai: