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
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
Đú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ả.
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
Ý 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ì.
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