Kiu 2: Lp cho n khi iu kin là FALSE
1. Trong VBA IDE, chọn trình đơn Debug Add Watch để hiển thị hộp thoại Add Watch
2. Nhập biểu thức cần theo dõi trong mụcExpression.
3. Chọn tên mô-đun và tên của chương trình con, nơi có chứa biến/biểu thức cần theo dõi trong mụcModulevàProcedure.
4. Nhấn ENTER hoặc chọnOKđể thêm vào cửa sổ theo dõi.
GỢI Ý Để không phải thực hiện các bước và , trước khi hiển thị của sổ theo dõi, cần đánh dấu chọn biến/biểu thức sẽ được theo dõi. Khi đó, các mục Expression, Module và Procedure sẽ được tự động điền các giá trị tương ứng.
http://www.ebook.edu.vn Hình II-41: Thêm biểu thức vào cửa sổ theo dõi.
14.3. Bẫy lỗi trong VBAIDE
Như đã đề cập ở trên, khi gặp phải những lỗi phát sinh lúc thực thi chương trình sẽ gây ra những kết quả không thể tiên đoán được hoặc chương trình sẽ dừng lại và sẽ hiển thị thông báo lỗi rất phức tạp. Nếu đứng về phía người sử dụng chương trình thì những hộp thoại như vậy thường gây ra sự lúng túng khi sử dụng chương trình. Để tránh những hiện tượng như vậy, người lập trình cần phải thực hiện các kỹ thuật bẫy lỗi trong khi viết chương trình.
Bẫy lỗi thực chất là viết các đoạn mã lệnh chặn các thông báo lỗi mặc định của hệ thống và hướng dẫn chương trình cách thức xử lý lỗi đã chặn được. Các đoạn chương trình xử lý lỗi còn được gọi là bộ xử lý lỗi (error-handler). VBA có cung cấp các câu lệnh nhằm giúp người lập trình thực hiện bẫy lỗi trong chương trình của mình.
14.3.1. Câu lệnh On Error
Câu lệnhOn Error sẽ thực bật chế độ bẫy lỗi trong chương trình và xác định nơi sẽ thực hiện xử lý các lỗi khi lỗi xảy ra. Để tắt chế độ bẫy lỗi, người lập trình cũng dùng chính câu lệnh này.
Các dạng cú pháp của câu lệnh này như sau:
C php M t
On Error GoTo <Label> Bật chế độ bẫy lỗi. Khi có lỗi xảy ra, chương trình sẽ được tự động nhảy đến dòng lệnh có nhãn <Label> để tiếp tục thực thi mã lênh. Đây chính là nơi chứa bộ xử lý lỗi của chương trình. Cần lưu ý là phần mã lệnh có nhãn <Label> phải nằm trong cùng một chương trình với câu lệnh On Error. Khi dùng bẫy lỗi kiểu này, trước nhãn <Label> thường có lệnh Exit Sub hoặc Exit Function (tuỳ thuộc chương trình con được bẫy lỗi) nhằm tránh thực thi bộ xử lý lỗi trong trường hợp lỗi không xảy ra.
On Error Resume Next Bật chế độ bẫy lỗi. Khi có lỗi xảy ra, chương trình sẽ tự động nhảy đến dòng lệnh ngay sau dòng lệnh gây lỗi để tiếp tục thực thi mã lệnh. Câu lệnh này thường được sử dụng khi có câu lệnh truy xuất đến một đối tượng nào đó. Để nắm rõ lỗi đã phát sinh, câu lệnh này thường được sử dụng kết hợp với đối tượng Error (xem thêm mục “Đối tượng Err” trang 95)
On Error GoTo 0 Tắt chế độ bẫy lỗi. Khi thực hiện dòng lệnh này, các lỗi đã phát sinh trước đó sẽ được xoá và đồng thời kể từ sau dòng lệnh này, các lỗi sẽ không được chặn lại và xử lý nữa, và như vậy chương trình có thể ngưng hoạt động nếu có lỗi thực thi xảy ra.
Khi sử dụng câu lệnh On Error GoTo <Label>, ngay trước nhãn <Label> thường có lệnh Exit Sub hoặcExit Function (tuỳ thuộc chương trình con được bẫy lỗi) nhằm tránh thực thi bộ xử lý lỗi trong trường hợp lỗi không xảy ra. Vì vậy, khuôn mẫu của các chương trình có bộ xử lý lỗi có thể được tham khảo thao đoạn mã lệnh sau:
Sub InitializeMatrix(Var1, Var2, Var3, Var4) On Error GoTo Bộ_xử_lý_lỗi
. . . Exit Sub Bộ_xử_lý_lỗi:
. . .
Resume Next End Sub
Đoạn chương trình sau đây sẽ thực hiện truy xuất đến một tệp, sau đó đóng tệp đó lại. Nếu trong quá trình thao tác có lỗi xảy ra, chương trình sẽ được tự động nhảy đến dòng lệnh phía sau nhãnlbErrđể hiển thị thông báo về lỗi đã xảy ra cho người sử dụng.
Sub SolveErrorExample() On Error GoTo lbErr
Open "C:\fileABC.txt" For Input As 1 Close 1
Exit Sub lbErr:
MsgBox "Loi xay ra: " & Err.Description, vbCritical, "Thong bao loi"
End Sub
Khi thực thi chương trình, trong trường hợp tệp C:\fileABC.txt không tồn tại, người dùng sẽ nhận được thông báo lỗi như sau:
Hình II-42: Thông báo lỗi do người dùng tự tạo 14.3.2. Đối tượng Err
Đối tượngErrchứa tất cả các thông tin về lỗi thực thi của chương trình. Đối tượng này thường được sử dụng cùng với câu lệnh On Error Resume Next. Nhờ có đối tượng Err mà người
http://www.ebook.edu.vn
Đối tượng Err có nhiều phương thức và thuộc tính khác nhau phục vụ cho việc xử lý lỗi. Trong đó, những thuộc tính và phương thức được sử dụng nhiều nhất bao gồm: Description, NumbervàClear.
Thu#c tính Number
Thuộc tính Number trả về số hiệu của lỗi thực thi. Đây cũng là thuộc tính mặc định của đối tượngErr, nghĩa là hai biểu thứcErr.Number vàErrlà tương đương nhau, đều trả về số hiệu của lỗi thực thi.
Trong trường hợp không có lỗi xảy ra, thuộc tính này trả về giá trị 0.
Thu#c tính Description
Thuộc tínhDescriptiontrả về chuỗi ký tự mô tả thông tin ngắn gọn về lỗi thực thi đã xảy ra.
Thông thường, khi lỗi xảy ra, nên ít nhất là hiển thị thông báo lỗi cho người dùng bằng cách sử dụng hàmMsgBox kết hợp với thuộc tínhDescription.
Trong trường hợp không có lỗi xảy ra, thuộc tính này trả về chuỗi ký tự rỗng “”.
Phng thc Clear
Phương thứcClear sẽ xoá tất cả các thuộc tính của đối tượngErr, có nghĩa là sau khi thực thi phương thức Clear, đối tượng Err sẽ được trở về trạng thái như khi không có lỗi xảy ra.
Phương thức này thường được gọi sau khi đã tiến hành xử lý xong các lỗi thực thi.
Ví dụ sau sẽ minh hoạ cách thức sử dụng đối tượng Err. Trong ví dụ này có thực hiện phép chia cho 0, vì vậy chương trình sẽ làm phát sinh lỗi thực thi. Nhờ có câu lệnhOn Error GoTo out nên khi có lỗi, chương trình sẽ tự động nhảy đến câu lệnh sau nhãn out. Vì vậy các câu lệnh sau câu lệnh làm phát sinh lỗi như MsgBox xvà Exit Sub sẽ không bao giờ được thực hiện. Đoạn mã lệnh sau nhãnoutthực hiện nhiệm vụ thông báo cho người dùng số hiệu lỗi và mô tả về lỗi đó
Sub test()
On Error GoTo out Dim x, y
x = 1 / y ' Dòng lệnh này làm phát sinh lỗi chia cho 0 MsgBox x
Exit Sub out:
' Hiển thị thông báo lỗi cho người dùng MsgBox “Ma loi: ” & Err.Number
MsgBox Err.Description End Sub
14.3.3. Hàm Error
HàmError trả về chuỗi ký tự chứa mô tả về lỗi tương ứng của một số hiệu lỗi. Cú pháp của hàm như sau:
Error[(errornumber)]
Tham số errornumber là tham số tuỳ chọn, là số nguyên chứa số hiệu của một lỗi nào đó.
Nếuerrornumber là một lỗi hợp lệ nhưng chưa được định nghĩa, hàmError sẽ trả về chuỗi
“Application-defined or object-defined error.”. Nếu errornumber là một số không hợp lệ thì sẽ làm phát sinh lỗi. Nếu tham số errornumber bị bỏ qua, hàmError sẽ trả về mô tả của lỗi thực thi gần nhất.
Ví dụ sau sẽ hiển thị mô tả lỗi tương ứng của các số hiệu lỗi trong cửa sổ trung gian.
Sub VD_Error() Dim ErrNumber
For ErrNumber = 61 To 64 ' Lặp qua các giá trị 61 - 64.
Debug.Print Error(ErrNumber) ' In mô tả lỗi trong cửa sổ trung gian.
Next ErrNumber End Sub
http://www.ebook.edu.vn