2008-12-01 30 views
9

Tôi đang sử dụng trong phần đầu tiên của chương trình của tôitruy cập VBA: Có thể thiết lập lại xử lý

về lỗi đi để bắt đầu

Giả sử trong phần thứ hai của tôi, tôi đang một lần nữa sử dụng

về lỗi lỗi tiếp tục tiếp theo

Bẫy lỗi thứ hai này sẽ không được kích hoạt vì bẫy lỗi thứ hai sẽ vẫn hoạt động. Có cách nào để khử kích hoạt trình xử lý lỗi đầu tiên sau khi nó đã được sử dụng không?

Set objexcel = CreateObject("excel.Application") 
        objexcel.Visible = True 
        On Error GoTo Openwb 
        wbExists = False 
        Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls") 
        Set objSht = wbexcel.Worksheets("Sheet1") 
        objSht.Activate 
        wbExists = True 
Openwb: 

        On Error GoTo 0 
        If Not wbExists Then 
        objexcel.Workbooks.Add 
        Set wbexcel = objexcel.ActiveWorkbook 
        Set objSht = wbexcel.Worksheets("Sheet1") 

        End If 

        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 

    If Left(tdf.Name, 4) <> "MSys" Then 
     rs.MoveFirst 
     strsql = "SELECT * From [" & tdf.Name & "] WHERE s=15 " 

     Do While Not rs.EOF 
      On Error Resume Next 

      rs2.Open strsql 

Khi thực hiện câu lệnh cuối cùng tôi muốn bỏ qua lỗi và chuyển sang bảng tiếp theo nhưng xử lý lỗi dường như không hoạt động.

Trả lời

3

Tốt hơn hết là tránh lỗi, thay vì xử lý chúng. Ví dụ:

Set objexcel = CreateObject("excel.Application") 
objexcel.Visible = True 

'On Error GoTo Openwb ' 
'wbExists = False ' 

If Dir("C:\REPORT3.xls") = "" Then 
    objexcel.Workbooks.Add 
    Set wbexcel = objexcel.ActiveWorkbook 
    Set objSht = wbexcel.Worksheets("Sheet1") 
Else 
    Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls") 
    Set objSht = wbexcel.Worksheets("Sheet1") 
End If 

objSht.Activate 
'wbExists = True ' 
+0

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

+2

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. –

+0

@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ụ ý. –

1

thử

On Error Goto 0 

Để được trợ giúp thêm cái nhìn ở đây: http://msdn.microsoft.com/en-us/library/bb258159.aspx

+0

dường như không hoạt động – tksy

+0

Bạn có thể đăng mã nguồn của mình tại đây không? Có thể bạn đang sử dụng các báo cáo lỗi sai. –

4

Bạn cần để xóa lỗi. Thử đặt mã này vào:

If Err.Number > 0 Then 
    Err.Clear 
End If 

Bạn cũng có thể sử dụng Err.Number để xử lý các trường hợp lỗi cụ thể.

+0

Điều này dường như không làm việc. Mã này hoạt động nếu phần đầu tiên của excel được đặt trong một phụ riêng biệt nhưng tôi muốn nó như thế này như của bây giờ. – tksy

+0

Tôi không nghĩ rằng bạn nên loại bỏ tất cả các lỗi. Điều gì xảy ra nếu bạn loại bỏ một lỗi mà bạn không mong đợi? –

+0

David, điểm tốt. Đó là lý do tại sao tôi nói bạn có thể sử dụng Err.Number để xử lý các trường hợp lỗi cụ thể. Thay vì làm rõ ràng tất cả, chỉ cần rõ ràng nếu lỗi là một trong những bạn đang mong đợi. –

8

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ác vấn đề liên quan