Mục lục:
- Phục hồi sau lỗi
- Để giúp bạn duy trì tất cả các hoạt động xử lý lỗi này một cách thẳng thắn, dưới đây là một bản tóm tắt nhanh chóng. Một khối mã xử lý lỗi có các đặc điểm sau:
- Trong một số trường hợp, hoàn toàn không sao bỏ qua lỗi. Đó là khi câu lệnh On Error Resume Next xuất hiện.
Video: Hướng dẫn kỹ thuật Debug VBA trong Excel 2025
Khi bạn cần giải quyết các lỗi trong Excel VBA, bạn có thể sử dụng câu lệnh OnError. Tuy nhiên, có một số điều bạn cần biết trước tiên. Bạn có thể sử dụng câu lệnh On Error theo ba cách.
Cú pháp | Nhãn |
---|---|
Trên lỗi GoTo | Sau khi thực hiện câu lệnh này, VBA thực hiện lại câu lệnh
sau nhãn được chỉ định. Bạn phải bao gồm một dấu hai chấm sau nhãn để VBA nhận ra nó như một nhãn. |
Trên Error GoTo 0 | Sau khi thực hiện câu lệnh này, VBA sẽ tiếp tục kiểm tra lỗi bình thường
. Sử dụng câu lệnh này sau khi sử dụng một trong các câu lệnh Câu lệnh Lỗi khác hoặc khi bạn muốn gỡ lỗi xử lý trong thủ tục của bạn. |
Trên Lỗi Tiếp tục Tiếp | Sau khi thực hiện câu lệnh này, VBA đơn giản bỏ qua tất cả các lỗi
và tiếp tục thực hiện với câu lệnh tiếp theo. |
Phục hồi sau lỗi
Trong một số trường hợp, bạn chỉ cần thói quen kết thúc một cách duyên dáng khi xảy ra lỗi. Ví dụ, bạn có thể hiển thị một thông báo mô tả lỗi và sau đó thoát khỏi thủ tục. (Ví dụ về EnterSquareRoot5 được hiển thị trước đó sử dụng kỹ thuật này.) Trong các trường hợp khác, bạn muốn khôi phục lại từ lỗi, nếu có thể.
Để phục hồi từ một lỗi, bạn phải sử dụng một tuyên bố Resume. Thao tác này sẽ xóa trạng thái lỗi và cho phép bạn tiếp tục thực hiện ở một số vị trí. Bạn có thể sử dụng tuyên bố Resume theo ba cách.
thì vẫn có thể tiếp tục.
Tiếp tục Tiếp
.
Tiếp tục nhãn
Sub EnterSquareRoot6 () Dim Num As Variant Dim Msg Như String Dim Ans As Integer TryAgain: 'Thiết lập lỗi xử lý On Error GoTo BadEntry 'Nhắc một giá trị Num = InputBox ("Nhập giá trị") Nếu Num = "" Then Exit Sub' Chèn ActiveCell của hình vuông. Giá trị = Sqr (Số) Thoát khỏi Sub BadEntry: Msg = Err. Số Msg & vbNewLine & vbNewLine Msg = Msg & "Hãy chắc chắn rằng một phạm vi được chọn," Msg = Msg & "tờ không được bảo vệ," Msg = Msg & "và bạn nhập một giá trị không âm. "Msg = Msg & vbNewLine & vbNewLine &" Hãy thử lại? "Ans = MsgBox (Msg, vbYesNo + vbCritical) Nếu Ans = vbYes Sau đó Tiếp tục TryAgain End Sub
Thủ tục này có nhãn khác: TryAgain.Nếu lỗi xảy ra, quá trình thực thi vẫn tiếp tục tại nhãn BadEntry, và mã hiển thị thông báo dưới đây. Nếu người dùng trả lời bằng cách nhấp vào Có, câu lệnh Tiếp tục khai thác, và thực hiện nhảy trở lại nhãn TryAgain. Nếu người dùng nhấp vào Không, thủ tục kết thúc.
Nếu xảy ra lỗi, người dùng có thể quyết định thử lại.
Lưu ý rằng thông báo lỗi cũng bao gồm số lỗi, cùng với mô tả lỗi "chính thức".Tờ khai Resume xóa các điều kiện lỗi trước khi tiếp tục. Để xem điều này, hãy thử thay thế câu lệnh sau cho câu lệnh thứ hai trong ví dụ trước:
Nếu Ans = vbYes Sau đó GoTo TryAgain
Mã không hoạt động đúng nếu bạn sử dụng GoTo chứ không phải là Resume. Để chứng minh, hãy nhập một số âm. Bạn nhận được thông báo lỗi. Nhấp Có để thử lại và sau đó nhập
số âm khác. Lỗi thứ hai này không bị mắc kẹt vì tình trạng lỗi ban đầu không bị xóa. Lỗi xử lý
Để giúp bạn duy trì tất cả các hoạt động xử lý lỗi này một cách thẳng thắn, dưới đây là một bản tóm tắt nhanh chóng. Một khối mã xử lý lỗi có các đặc điểm sau:
Bắt đầu ngay sau khi nhãn được chỉ định trong câu lệnh On Error.
-
Chỉ cần macro của bạn phải đạt được nếu xảy ra lỗi. Điều này có nghĩa là bạn phải sử dụng một câu lệnh như Exit Sub hoặc Exit Function ngay trước nhãn.
-
Có thể yêu cầu một bản tuyên bố về việc làm lại. Nếu bạn chọn không hủy bỏ thủ tục khi xảy ra lỗi, bạn phải thực hiện một tuyên bố Resume trước khi quay lại mã chính.
-
Biết khi nào nên bỏ qua lỗi
Trong một số trường hợp, hoàn toàn không sao bỏ qua lỗi. Đó là khi câu lệnh On Error Resume Next xuất hiện.
Ví dụ sau lặp đi qua mỗi ô trong dải ô đã chọn và chuyển giá trị sang căn bậc hai của nó. Thủ tục này tạo ra một thông báo lỗi nếu bất kỳ ô nào trong vùng lựa chọn chứa một số âm hoặc văn bản:
Sub SelectionSqrt () Dim cell As Range Nếu TypeName (Selection) <> "range" Sau đó Thoát khỏi Sub Cho Mỗi ô Trong ô Selection. Cú pháp tiếp theo: End Sub
Trong trường hợp này, bạn có thể bỏ qua bất kỳ ô nào chứa giá trị bạn không thể chuyển thành một căn bậc hai. Bạn có thể tạo ra tất cả các loại kiểm tra lỗi bằng cách sử dụng cấu trúc If-Then, nhưng bạn có thể tạo ra một giải pháp tốt hơn (đơn giản hơn) bằng cách bỏ qua các lỗi xảy ra.
Các bước sau đây thực hiện điều này bằng cách sử dụng câu lệnh On Error Resume Next:
Sub SelectionSqrt () Dim cell As Range Nếu TypeName (Selection) <> "range" Sau đó Exit Sub On Lỗi Tiếp tục Tiếp theo Đối với mỗi ô Trong Selection tế bào. Bạn có thể sử dụng câu lệnh On Error Resume Next nếu bạn xem các lỗi này vô hại hoặc không quan trọng đối với công việc của bạn.