"On Error Goto 0" nghĩa là gì?

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Tôi thường thấy trong các chương trình, người ta hay dùng đoạn mã "On Error Goto 0" nhưng chưa hiểu nó là cái gì
Tôi đoán chừng thế này: Nếu trong chương trình, ta có câu bẫy lỗi On Error Resume Next hoăc On Error Goto gì gì đó thì nếu như sau đó vài dòng, tôi viết thêm câu On Error Goto 0 vào sẽ làm cho hệ thống phát hiện lỗi của Excel được phục hồi trở lại
Ví dụ:
- Mở 1 bảng tính mới và chèn code này vào 1 Module:
PHP:
Sub Test()
  Dim Rng As Range
  Set Rng = Range("B1:B10").SpecialCells(4)
  Rng.Select
End Sub
Code này đương nhiên bị lỗi vì không tìm thấy vùng Blanks! Giờ tôi sửa lại thành:
PHP:
Sub Test()
  Dim Rng As Range
  On Error Resume Next
  Set Rng = Range("B1:B10").SpecialCells(4)
  Rng.Select
End Sub
Code sẽ bỏ qua lỗi và.. không làm gì cả
Nếu tôi sửa lại thế này:
PHP:
Sub Test()
  Dim Rng As Range
  On Error Resume Next
  Set Rng = Range("B1:B10").SpecialCells(4)
  On Error GoTo 0
  Rng.Select
End Sub
Sau khi vượt qua lỗi đầu tiên, đoạn On Error GoTo 0 sẽ phục hồi hệ thống tìm lỗi của Excel nên code sẽ bị phát hiện lỗi tiếp (phát hiện lỗi tại dòng Rng.Select vì đến thời điểm hiện tại vẫn chẳng có Rng nào được xác định)
-----------------------------
Chỉ thí nghiệm và suy đoán thế thôi! Xin các cao thủ, ai rành việc này giải thích rõ giúp tôi với
Cảm ơn!
 
Bác dùng trường hợp này sau khi đã kiểm soát hết lỗi ở nội dung code phía trên, để kiểm tra chất lượng code phía dưới thì sử dụng dòng này ở trên. Nếu gặp lỗi thì VBA thông báo bình thường.
 
Upvote 0
qua vấn đề này em search và học hỏi thêm được một tí,

"On error goto 0" đúng là để tắt cái bẩy lỗi trước đó, cho mọi thứ trở lại bình thường.
Trước giờ em cứ tưởng nó là câu "Gặp lỗi tắt luôn chương trình" :D

Mã:
Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer
   Dim y As Integer
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox (Msg & "Divide by zero error")
      Err.Clear
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at same line
                ' that caused the error.
End Sub
 
Upvote 0
Bẫy lỗi là việc khá thú vị, ngay từ thời xa xưa của phần mềm này.
Đặc biệt trong điều kiện chương trình đọc dữ liệu từ flle đang mở.

Nếu cấu trúc dữ liệu không phù hợp, ví dụ cần mở file có tên trong ô A1, song file không có thực trên đĩa, thì bị lỗi. Bình thường chương trình chấm dứt, nhưng nếu ta dự kiến lỗi này, thì có thể thông báo cho người dùng, hoặc "lờ đi" và đọc tiếp file khác (có tên, chẳng hạn ở ô A2).

Tôi có vài ý, cốt để anh em mới quen bẫy lỗi tham khảo thêm.
 
Upvote 0
Ngoài ra, mình thấy như thế này :

- Nếu dùng On Error Resume Next ngay từ đầu thì cứ gặp lỗi là bỏ qua, dẫn đến khi code chạy ra kết quả không mong muốn thì ta cũng không thể biết được nó trục trặc ở đâu để mà sửa. Do vậy, trong trường hợp này, ta tạm thời dừng bẫy lỗi bằng On Error Goto 0 để biết được là xảy ra lỗi ở dòng lệnh nào để xử lý.

- Mình hay làm thế này, cứ viết code thoải mái, đừng bẫy lỗi gì hết, có lỗi gì sửa hết đi đã, nếu cần thiết quá thì đặt On Error Resume Next nhưng sau đó tắt bẫy lỗi ngay bằng On Error Goto 0. Cứ như vậy cho đến khi chạy ngon lành rồi mới đặt lại bẫy lỗi cho toàn bộ code.

- Dùng On Error Resume Next đôi khi cũng là con dao 2 lưỡi, vì nó bỏ qua những dòng code quan trọng dẫn đến kết quả cuối sùng bị sai lệch. Theo mình, nên dùng như sau :

PHP:
Sub Test
   On Error Goto Thoat
   ...............
   ...............
   ...............

   Exit Sub

Thoat :
   Msgbox "Có lỗi rồi, kết quả không đáng tin cậy, dò code lại cho chắc"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
các bác cho em hỏi nếu em không tìm được đoạn code bên dưới này trong chương trình thì sẽ viết thế nào để nó bỏ qua và làm tiếp tục với các bước change khác, kèm theo nó sẽ remark pending bên cạnh session.findById("wnd[0]/usr/tabsTS_ITEM/tabpPHPT/ssubSUBPAGE:SAPLCSDI:0830/btnP_ALTERNATIVPOS").press
thân ái.
 
Upvote 0
các bác cho em hỏi nếu em không tìm được đoạn code bên dưới này trong chương trình thì sẽ viết thế nào để nó bỏ qua và làm tiếp tục với các bước change khác, kèm theo nó sẽ remark pending bên cạnh session.findById("wnd[0]/usr/tabsTS_ITEM/tabpPHPT/ssubSUBPAGE:SAPLCSDI:0830/btnP_ALTERNATIVPOS").press
thân ái.
SAP hả bạn?
 
Upvote 0
vầng bác
 
Upvote 0
Bạn . . . à . Nếu code đó lỗi thì cho on error resume next thôi .
Bạn này thích xài dao 2 lưỡi, nhỉ!
Cần biết lỗi gì để cho qua & lỗi gì nên xử lý cho rốt ráo; Ai lại cho qua cả lũ như thế!

PHP:
Sub LoiChuongTrinh()
Dim GPE As Long, Num As Long
On Error GoTo LoiCT
13 ' . . . . . . .        '
MsgBox (13 + GPE) / Num
35' Xin Chào Các Ban!
Err_:               Exit Sub
LoiCT:
If Err <> 11 Then
    Resume Next
Else
    MsgBox Error, , Erl()
    Resume Err_
End If
End Sub
 
Upvote 0
Bạn đang làm từ exel à . Nếu code đó lỗi thì cho on error resume next thôi .
làm từ Excel nhưng nó chạy trên SAP bác ạ
Bài đã được tự động gộp:

Bạn này thích xài dao 2 lưỡi, nhỉ!
Cần biết lỗi gì để cho qua & lỗi gì nên xử lý cho rốt ráo; Ai lại cho qua cả lũ như thế!

PHP:
Sub LoiChuongTrinh()
Dim GPE As Long, Num As Long
On Error GoTo LoiCT
13 ' . . . . . . .        '
MsgBox (13 + GPE) / Num
35' Xin Chào Các Ban!
Err_:               Exit Sub
LoiCT:
If Err <> 11 Then
    Resume Next
Else
    MsgBox Error, , Erl()
    Resume Err_
End If
End Sub
mình đã giải thích ở bên trên rồi bạn, lỗi nó chỉ tick vào 2 cái nút để xác nhận thôi mà, đâu có bỏ qua cả lũ đâu.
 
Upvote 0
Web KT
Back
Top Bottom