On error goto 0
Hãy cho tay để thị giác cơ bản để xử lý lỗi (trong hộp thông báo chung)
On error goto label
sẽ chuyển hướng mã của bạn để nhãn:
On error resume next
sẽ bỏ qua lỗi và tiếp tục
Resume next
chuyển hướng mã đến dòng tiếp theo er lỗi được nâng lên
nó có nghĩa là sự kết hợp của hướng dẫn như
On Error goto 0
...
On Error goto 0
không có ý nghĩa
Và nếu bạn muốn chuyển hướng một lệnh "về lỗi" bạn sẽ phải làm theo cách này:
Do While Not rs.EOF
On Error Resume Next
rs2.Open strsql
On error Goto 0
rs2.moveNext
Loop
Nếu bạn muốn chuyển hướng lỗi tới nhãn (để điều trị hoặc bất kỳ thứ gì) và sau đó quay lại mã nơi xảy ra lỗi, bạn phải viết gì đó như:
On error goto label
...
...
On error goto 0
exit sub (or function)
label:
....
resume next
end function
Nhưng tôi thực sự khuyên bạn nên nghiêm túc hơn trong việc quản lý lỗi của mình. Trước tiên, bạn có thể làm điều gì đó tương tự:
Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True
On Error GoTo error_Treatment
wbExists = False
Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
wbExists = True
On error GoTo 0
Set db = DBEngine.opendatabase("C:\book.mdb")
Set rs = db.OpenRecordset("records")
Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection
For Each tdf In CurrentDb.TableDefs
....
'there are a number of potential errors here in your code'
'you should make sure that rs2 is closed before reopening it with a new instruction'
'etc.'
Next tdf
Exit sub
error_treatment:
SELECT Case err.number
Case **** '(the err.number raised when the file is not found)'
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Set objSht = wbexcel.Worksheets("Sheet1")
Resume next 'go back to the code'
Case **** '(the recordset cannot be opened)'
....
....
Resume next 'go back to the code'
Case **** '(whatever other error to treat)'
....
....
Resume next 'go back to the code'
Case Else
debug.print err.number, err.description '(check if .description is a property of the error object)'
'your error will be displayed in the immediate windows of VBA.'
'You can understand it and correct your code until it runs'
End select
End sub
Bước tiếp theo sẽ là dự đoán các lỗi trong mã của bạn để đối tượng err không được nâng lên.Bạn có thể ví dụ như viết một hàm tổng quát như thế này:
Public function fileExists (myFileName) as Boolean
Sau đó, bạn có thể tận dụng chức năng này trong mã của bạn bằng cách kiểm tra sự tồn tại của tập tin xls bạn:
if fileExists("C:\REPORT3.xls") Then
Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
Else
objexcel.Workbooks.Add
Set wbexcel = objexcel.ActiveWorkbook
Endif
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
Bạn không cần biến wbExist của bạn nữa ...
Trong cùng một cách, bạn nên dự đoán trường hợp bản ghi của bạn không có bản ghi. Viết xuống rs.MoveFirst trước khi kiểm tra nó có thể gây ra lỗi. Sau đó, bạn nên viết
If rs.EOF and rs.BOF then
Else
rs.moveFirst
Do while not rs.EOF
rs.moveNext
Loop
Endif
Cảm ơn đã làm công việc. Nhưng như là một nghi ngờ không phải là nó có thể anyway để hủy bỏ một lỗi xử lý sau khi nó được sử dụng trước khi tiếp tục trong chương trình. – tksy
Quibble: trong VBA nó hiệu quả hơn khi kiểm tra chuỗi có độ dài bằng không để sử dụng vbNullString thay vì "" vì hằng số Access đó đã có bộ nhớ được cấp phát. Nó không quan trọng trong hằng số này, nhưng nó là tốt để có được trong thói quen, do đó bạn luôn luôn sử dụng vbNullString bên trong vòng. –
@tksy: "Trên Lỗi GoTo 0" thực hiện chính xác điều đó. Nó trả về VBA để xử lý lỗi thông thường của nó. Nó không có nghĩa là "On Error GoTo Start" mà tôi nghĩ câu hỏi của bạn ngụ ý. –