Hàm Lỗi

tuhocvba

Administrator
Thành viên BQT
1. CVErr
Hôm nay tôi sẽ giới thiệu với các bạn hàm CVErr.
Hàm này có thể tạo ra lỗi.
Chúng ta sẽ sử dụng nó để phán đoán lỗi, hoặc thiết định lỗi cho giá trị một cells trên Excel,.
Chú ý: Khi muốn phán đoán lỗi, chúng ta sẽ sử dụng hàm IsError , sẽ được giới thiệu sau.
Cấu trúc:
Mã:
CVErr(ErrNumber)
Giá trị trả về là Error.
Hằng sốGiá trịGiá trị trả về (là lỗi)
xlErrDiv0
2007​
#DIV/0!​
XlErrNA
2042​
#N/A​
xlErrName
2029​
#NAME?​
XlErrNull
2000​
#NULL!​
XlErrNum
2036​
#NUM!​
XlErrRef
2023​
#REF!​
XlErrValue
2015​
#VALUE!​

Đối số input là ErrNumber nhận giá trị từ 0 tới 65535.
Khi Cells hiển thị giá trị lỗi thì thường hiển thị ra là như là #N/A hay #VALUE!
Giá trị trả về của hàm có kiểu dữ liệu là Variant. Ngoài kiểu này ra thì sẽ phát sinh lỗi.
Giá trị trả về của hàm, nếu truyền vào hàm IsError thì giá trị trả về của hàm IsError sẽ là True. Điều này giúp chúng ta phán đoán đã có lỗi xảy ra hay không.
Chúng ta có thể tự tạo ra lỗi. Đây không phải là lỗi do chương trình VBA gây ra, mà chính chúng ta cố ý tạo ra.
Ví dụ, nếu như input là A thì ấn nút B, đây là ý đồ của ta.
Nhưng kịch bản giả định là người dùng ấn B trước và ta muốn khi đó sẽ phát sinh ra lỗi.
Ta quyết định rằng, với kịch bản trên (người dùng ấn B trước) thì ta sẽ cho ErrNumber là 60000. Khi đó nếu có lỗi nào đó xảy ra, ta sẽ hiểu được nguyên nhân là gì.

VÍ DỤ:
Mã:
Dim v As Variant

v = CVErr(1)
Debug.Print(v) ' Err 1

v = CVErr(65536) ' Phát sinh lỗi của VBA

Cells(1, 1).Value = CVErr(xlErrNA) ' Ghi vào cells A1 là #N/A

'Khi cells A1 là #N/A thì tiến hành xử lý
If Cells(1, 1).Value = CVErr(xlErrNA) Then
    Debug.Print("#N/A")
End If
Bây giờ ta sẽ dùng hàm IsError để phán đoán là có đúng là đã có lỗi thực sự xảy ra hay không?
Mã:
Sub ThucThi()
    Dim v As Variant
    v = Tips(10)
    
    If IsError(v) = False Then
        Debug.Print(v) ' Bình thường
    Else
        Debug.Print(v) ' Err 60000
    End If

    v = Tips(0)
    
    If IsError(v) = False Then
        Debug.Print(v) ' Bình thường
    Else
        Debug.Print(v) ' Err 60000
    End If
End Sub

Function Tips(ByVal i As Integer) As Variant
    If i = 10 Then
        Tips = "Binh thuong" 'Bình thường'
    Else
        Tips = CVErr(60000) ' System error
    End If
End Function
Nguồn tham khảo và dịch:
 
2. Error
Hàm này sẽ xử lý như sau: Ứng với ErrNumber được chỉ định, nó sẽ trả về hộp thoại thông báo lỗi tương ứng.
Từ ErrNumber của lỗi đã phát sinh, chúng ta sẽ sử dụng trong trường hợp muốn biết nội dung lỗi là gì.

Mã:
Error()
Nó sẽ lấy lỗi cuối cùng được phát sinh.

Mã:
Error(ErrNumber)
Nó sẽ lấy lỗi tương ứng với ErrNumber.
ErrNumber có thể giản lược. Trong trường hợp chỉ định thì giá trị của nó nằm trong khoảng 0~65535.

Giá trị trả về là String.

Giải thích:
Từ lỗi phát sinh của VBA, ta lấy được ErrNumber và từ đó sẽ lấy được nội dung thông báo tương ứng với lỗi này.
Giá trị trả về là thông báo lỗi ứng với đối số ErrNumber. Ngoại trừ mã lỗi 13. (Type mismatch). Lỗi 13 sẽ dừng ngay khi trình biên dịch phát hiện ra lỗi.
Đối số ErrNumber có thể giản lược, khi giản lược thì hàm sẽ trả về nội dung thông báo lỗi tương ứng với lỗi cuối cùng được phát sinh.
Trường hợp không có lỗi phát sinh thì giá trị trả về là một chuỗi rỗng.

Từ VBA để biết chi tiết nội dung lỗi ta có thể lấy từ đối tượng Err Object. Hàm Error có giá trị trả về giống với thuộc tính Description của Err Object.

Chú ý: Khi sử dụng hàm Error nếu truyền ErrNumber mà không có dấu đóng mở ngoặc () thì đây là hình thức cưỡng chế tạo ra lỗi.

VÍ DỤ:
Mã:
Dim s As String

s = Error(6)
Debug.Print(s) ' overflow

s = Error(13)
Debug.Print(s) ' Type mismatch
Lấy lỗi cuối cùng bị phát sinh :
Mã:
Sub ThucThi()
On Error GoTo Catch

    Dim s As String
    s = Error ' Loi cuoi cung phat sinh
    Debug.Print(s) ' ""
   
    ' Tao ra loi
    Dim i As Integer
    i = ""  
    Error 13 ' Cưỡng chế tạo ra lỗi Type mismatch

Catch:
    s = Error ' Lấy lỗi cuối cùng phát sinh
    Debug.Print(s) ' Type mismatch

    s = Err.Description
    Debug.Print(s) ' Type mismatch
End Sub
Nguồn:
 
Top