Viet code để end sub khi phát hiện lỗi

Liên hệ QC

thanhnhanubnd

Thành viên hoạt động
Tham gia
12/9/08
Bài viết
180
Được thích
29
Nghề nghiệp
Xay dung
Mình có vấn đề sau mong các bạn chỉ giúp :
Viết dùm code khi phát hiện lỗi thì hiện thông báo " ......." và end sub, chứ không báo lỗi trong Visual Basic Editor ( Alt + F11).
Tức là : Nếu code nào bị lỗi thì hiện thông báo"" và End sub luôn chứ không và VB Edỉtor
 
Thử cái này xem được không bạn.

PHP:
On Error Goto Thoat
................
................
Thoat:
End sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có vấn đề sau mong các bạn chỉ giúp :
Viết dùm code khi phát hiện lỗi thì hiện thông báo " ......." và end sub, chứ không báo lỗi trong Visual Basic Editor ( Alt + F11).
Tức là : Nếu code nào bị lỗi thì hiện thông báo"" và End sub luôn chứ không và VB Edỉtor
Bạn viết code:

HTML:
Sub Vidu()
Dim ....
On Error GoTo baoloi
......
.....
Exit Sub
baoloi:
MsgBox "Ban nhap sai !"
End Sub
Khi bị lỗi, chương trình sẽ nhảy đến nhản baoloi, thực hiện các lệnh trong nhản và kết thúc.
 
Upvote 0
Sub Vidu()
Dim ....
On Error GoTo baoloi
......
.....
Exit Sub
baoloi:
MsgBox "Ban nhap sai !"
End Sub

Tức là nếu code không có lỗi thì vẫn chạy đúng không bạn?
 
Upvote 0
Đúng rồi, nếu có lỗi (On Error) thì chương trình sẽ đi đến (GoTo) làm cái việc trong baoloi: (hiện Msgbox thông báo "Bạn nhập sai!", nếu bạn xoá dòng MsgBox "Ban nhap sai !" thì chương trình sẽ không báo gì cả, cứ thế thoát thôi). Nếu không có lỗi thì chẳng có gì xảy ra cả.

Đọc bài này đi bạn, rất hữu ích đó.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Theo mình phải bẫy lỗi như sau :

Sub Vidu()
Dim ....
On Error GoTo baoloi
......
.....
Thoat:
Exit Sub

baoloi:
MsgBox "Ban nhap sai !"
goto thoat

End Sub

Nhãn Thoat phải đặt trwớc nhãn báo lỗi để khi không có lỗi sub thực hiện thoát và bỏ qua báo lỗi
Thông thường câu lệnh On Error GoTo baoloi người ta đặt ngay sau khi khai các biến
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải chú ý có nhiều loại lỗi có thể xảy ra trong quá trình chạy code. Muốn tìm hiểu thêm về lỗi thì cấy thêm cái này


Từ đó nắm loại lỗi mình muốn điều khiển.
 
Upvote 0
Ý kiến Phan Tự Hướng rất cần cho việc gỡ lỗi. Theo mình nên dùng Err.description hay hơn vì mình biết ngay nội dung lỗi, còn mã lỗi thôi thì đòi hỏi người thực sự thành thạo mới biết lỗi đó là lỗi gì.
 
Upvote 0
Tùy thuộc loại lỗi mà ta có những ứng xử khác nhau

* Lỗi mà ta cùng chương trình gặp phải nó, ta có thể phớt lờ, xua chương trình chạy tiếp bằng lệnh Resume Next, nhưng cũng có lỗi, như lỗi nhập liệu, thay vì ký tự ta nhập số vô biến thì ta có thể nhẹ nhàng bảo macro của chúng ta quay lại vị trí nào đó lấy lại dùm 'tau' 1 biến kiểu khác.
* Cũng có những lỗi trong tầm kiểm soát, ta thay biến đó tăng giảm vài đơn vị (để tránh chia cho 0 chẳng hạn)
* Cũng có những lỗi ta phải thoát ra ngoài, pha ly Trung nguyên nhâm nhi cái lỗi đó cho đến khi khuất phục được nó.
(*) cũng có những lỗi (như ví dụ dưới đây) ta có bẫy cách nào chẳng nữa cũng không buộc nó theo mọi đường mà ta đã vạch ra)

Hàm trích dẫn dưới đây là của tác giả có NickName là Andi Pope
Hàm này sẽ hoạt động tốt chỉ trong cửa sổ trung gian! Và chỉ có vậy
Nhưng đem ra trang tính thì không có cách gì bẫy lỗi cho được;
(Tôi có thêm nội dung bẫy lỗi phía dưới để minh họa bài viết)

PHP:
Function SumIndex2(ByVal sField As String, ByVal sIndex As String) As Double
  On Error GoTo Loifunc
    Dim i   As Integer:                 Dim dSum As Double
    Dim Rng As Range:                   Dim MyAdd As String
     'Find the column with the title = sField'
    i = Application.WorksheetFunction.Match(sField, Worksheets("S0").Range("$A$9:$Z$9"), 0)
    
    With Worksheets("Sheet3").Columns(1)
GPE:         Set Rng = .Find(sIndex, LookIn:=xlValues, LookAt:=xlWhole)
        If Not Rng Is Nothing Then
            MyAdd = Rng.Address
5            Do
6                dSum = dSum + Rng.Offset(, 1).Value
7                MsgBox Rng(1, i - 1).Address, , dSum
8                Set Rng = .FindNext(Rng)
                If Rng Is Nothing Then
                    SumIndex2 = 34
                    Exit Do      ' required when called from worksheet'
                End If
             Loop While Not Rng Is Nothing And Rng.Address <> MyAdd
        Else
            SumIndex2 = i
            Exit Function
        End If
    End With
    SumIndex2 = dSum
ErrFunc:                Exit Function
  Loifunc:
      Select Case Err
      Case 2009
          Resume Next
      Case 3535
          GoTo GPE
      Case 5
          SumIndex = 1234567890
          GoTo ErrFunc
      Case Else
          MsgBox Error$:                                      GoTo ErrFunc
      End Select     
End Function
Từ hàm đó, mình chế lại 1 hàm như vầy:

PHP:
Option Explicit
 Function SumIndex(ByVal Rng As Range, ByVal sIndex As String) As Double
     Dim jJ   As Integer:                            Dim dSum As Double
     Dim MyAdd As String:                            Dim sRng As Range
     On Error Resume Next:                           'From orgrid.com'
     With Rng
         Set sRng = .Find(sIndex, , LookIn:=xlValues, LookAt:=xlWhole)
         If Not sRng Is Nothing Then
             MyAdd = sRng.Address
             Do
                 dSum = dSum + sRng.Offset(, 1).Value
                 Set sRng = .FindNext(sRng)
                 
                 If sRng Is Nothing Then Exit Do ' required when called from worksheet'
             Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
     End With
     SumIndex = dSum
 
 End Function
Hàm này cũng thực thi hoàn hão trong cửa sổ trung gian; nhưng đem ra trang tính không báo lỗi, nhưng làm trật lất.
Nó không cho ta SUM các ô thỏa điều kiện, mà chỉ cho ta giá trị duy nhất, đầu tiên mà nó tìm thấy

(Bài viết hơi lang man, mong các bạn lượng thứ!)

:=\+ --=--
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom