Thuộc tính và phương thức đối tượng Err trong VBA Excel
1. Thuộc tính đối tượng Err
Đối tượng Err bao gồm các thuộc tính dưới đây:
Mặc dù trong hầu hết các trường hợp chúng ta không cần sử dụng đối tượng Err, tuy nhiên đôi khi nó có thể hữu ích khi xử lý các lỗi trong Excel.
Cho ví dụ, giả sử nếu có tập dữ liệu như dưới đây, và chúng ta muốn tìm căn bậc 2 trong ô liền kề cho mỗi số trong phạm vi được chọn.
Bằng cách sử dụng đoạn mã dưới đây để làm điều đó. Tuy nhiên vì trong ô A5 là một chuỗi văn bản chứ không phải số nên nó sẽ trả về lỗi:
Sub FindSqrRoot()
Dim rng As Range
Set rng = Selection
For Each cell In rng
cell.Offset(0, 1).Value = Sqr(cell.Value)
Next cell
End Sub
Vấn đề là loại thông báo này không cung cấp cho chúng ta các thông tin gì về lỗi và lỗi xảy ra ở đâu.
Trong trường hợp này chúng ta có thể sử dụng đối tượng Err để lấy thông tin chi tiết thông báo lỗi.
Ví dụ, nếu bây giờ chúng ta sử dụng mã VBA dưới đây, nó sẽ dừng chạy mã ngay sau khi lỗi xảy ra và hiển thị hộp thoại thông báo lỗi có địa chỉ của ô xảy ra lỗi:
Sub FindSqrRoot()
Dim rng As Range
Set rng = Selection
For Each cell In rng
On Error GoTo ErrHandler
cell.Offset(0, 1).Value = Sqr(cell.Value)
Next cell
ErrHandler:
MsgBox "Error Number:" & Err.Number & vbCrLf & _
"Error Description: " & Err.Description & vbCrLf & _
"Error at: " & cell.Address
End Sub
Đoạn mã trên sẽ cung cấp cho chúng ta các thông tin chi tiết hơn, đặc biệt là cung cấp địa chỉ ô xảy ra lỗi.
Nếu muốn chúng ta có thể tinh chỉnh thêm đoạn mã này để đảm bảo mã sẽ chạy đến hết (thay vì dừng lại vì mỗi khi lỗi xảy ra), sau đó cung cấp danh sách đầy đủ địa chỉ các ô xảy ra lỗi.
Để làm được điều này, chúng ta sử dụng đoạn mã dưới đây:
Sub FindSqrRoot2()
Dim ErrorCells As String
Dim rng As Range
On Error Resume Next
Set rng = Selection
For Each cell In rng
cell.Offset(0, 1).Value = Sqr(cell.Value)
If Err.Number <> 0 Then
ErrorCells = ErrorCells & vbCrLf & cell.Address
On Error GoTo -1
End If
Next cell
MsgBox "Lỗi trong các ô sau" & ErrorCells
Exit Sub
End Sub
Đoạn mã trên sẽ chạy đến hết và trả về căn bậc 2 của các số trong các ô được chọn, sau đó nó sẽ hiển thị thông báo lỗi liệt kê tất cả các ô chứa lỗi như hình dưới đây:
2. Các phương thức đối tượng Err
Ngoài các thuộc tính Err được sử dụng để hiển thị thông tin chi tiết về lỗi, chúng ta có thể sử dụng 2 phương thức Err để xử lý lỗi.
Phương thức Mô tả
Clear Xóa tất cả các cài đặt thuộc tính của đối tượng Err.
Raise Tạo lỗi run-time.
2.1. Phương thức Err Clear
Cho ví dụ, giả sử chúng ta có bảng dữ liệu như dưới đây và muốn lấy căn bậc 2 của tất cả các số trong cột liền kề.
Khi sử dụng đoạn mã dưới đây để lấy căn bậc 2 của tất cả các số trong cột liền kề, nó sẽ trả về thông báo lỗi vì ô A5 và ô A9 là các chuỗi văn bản:
Sub FindSqrRoot2()
Dim ErrorCells As String
Dim rng As Range
On Error Resume Next
Set rng = Selection
For Each cell In rng
cell.Offset(0, 1).Value = Sqr(cell.Value)
If Err.Number <> 0 Then
ErrorCells = ErrorCells & vbCrLf & cell.Address
Err.Clear
End If
Next cell
MsgBox "Error in the following cells" & ErrorCells
End Sub
Lưu ý: trong ví dụ này chúng ta sử dụng phương thức Err.Clear trong lệnh If Then.
Khi lỗi xảy ra và bị bẫy bởi điều kiện If, chúng ta sử dụng phương thức Err.Clear để reset lại số lỗi về 0. Điều này để đảm bảo điều kiện If chỉ bẫy các ô bị lỗi. Trường hợp nếu không sử dụng phương thức Err.Clear, một khi lỗi xảy ra, nó sẽ luôn đúng trong điều kiện IF và mã lỗi không được reset lại.
Ngoài ra chúng ta có thể sử dụng lệnh On Error Goto -1 để reset lại lỗi.
Lưu ý: Err.Clear và On Error Goto -1 hoàn toàn khác nhau. Err.Clear chỉ xóa mô tả lỗi và mã lỗi chứ không reset lại lỗi hoàn toàn. Điều này có nghĩa là nếu có một lỗi khác xảy ra trong cùng một mã, chúng ta không thể xử lý lỗi trước khi reset lại. trường hợp này chúng ta sẽ phải sử dụng lệnh On Error Goto -1.
2.2. Phương thức Err Raise
Phương thức Err.Raise cho phép chúng ta tạo một lỗi run-time. Dưới đây là cú pháp sử dụng phương thức Err.Raise:
Err.Raise [number], [source], [description], [helpfile], [helpcontext]
Trong đó tất cả các đối số là tùy chọn, và chúng ta có thể sử dụng để tạo thông báo lỗi có ý nghĩa hơn.
Chúng ta có thể sử dụng phương thức này khi có lỗi xảy ra (tức là lỗi kiểu gì cũng sẽ xảy ra), sau đó sử dụng phương thức để thông báo cho người dùng khác biết về lỗi (thay vì sử dụng thông báo đơn giản, không hữu ích mà VBA hiển thị theo mặc định).
Cho ví dụ, chúng ta vẫn sử dụng ví dụ ở phần trên nhưng muốn thiết lập để tất cả các ô chỉ hiển thị giá trị số.
Sub RaiseError()
Dim rng As Range
Set rng = Selection
On Error GoTo ErrHandler
For Each Cell In rng
If Not (IsNumeric(Cell.Value)) Then
Err.Raise vbObjectError + 513, Cell.Address, "Not a number", "Test.html"
End If
Next Cell
ErrHandler:
MsgBox Err.Description & vbCrLf & Err.HelpFile
End Sub
Đoạn mã trên sẽ hiển thị thông báo lỗi bao gồm một mô tả và file ngữ cảnh.
Như vậy là bạn vừa cùng Taimienphi.vn tìm hiểu các thuộc tính và phương thức đối tượng Err. Nếu có thắc mắc hay câu hỏi nào cần giải đáp, bạn hãy để lại ý kiến trong phần bình luận để chúng ta cùng thảo luận nhé!
Ngoài ra, bạn không nên bỏ lỡ những bài viết hay, những chia sẻ rất hữu ích của Taimienphi.vn:
- Tham khảo bài viết Tất tần tật về VBA trong Excel Phần 1
- Tham khảo bài viết Tất tần tật về VBA trong Excel Phần 2
- Tham khảo bài viết Tất tần tật về VBA trong Excel Phần 3
Chúc bạn thành công!