2014-01-28 90 views
2

我有一段代碼可以從表中讀取信息並將其插入帶有主鍵的表中。第一個表是用戶通過許多不同的人進入,二是表我想清理VBA錯誤處理RESUME

爲了讓你發生了什麼僞代碼的想法下面應該幫助

  1. 記錄被讀入然後陣列
  2. 記錄被插入到表與來自陣列上的唯一標識符的主鍵
  3. 如果所述唯一標識符在表中已經存在的錯誤是由數據庫(未Access數據庫)
  4. 拋出錯誤信息被困在wi中試圖插入的記錄。違規的記錄,現在放入一個錯誤表以後的審查
  5. 簡歷,其中拋出的錯誤信息

的問題是,該代碼就會恢復在循環的開始而不是在那裏被執行查詢再次在這種情況下,在線路設置RS = cmdSQLData.Execute() 實際上這句話的意思是永遠試圖插入相同的記錄

在我的錯誤處理程序,我遞增環路上的一個記錄,以便它現在試圖插入下一條記錄。不幸的是,不被視爲在下次簡歷

什麼,我想在實踐中環路由1中的錯誤處理程序遞增,然後循環試圖插入下一條記錄

僞代碼

intNumberRows = UBound(myArray, 2) + 1 ' number of records/rows in the array 
rowcounter = 0 


' Append the Rows of local Table to the temp table 
For rowcounter = rowcounter To intNumberRows - 1 

' Values X Y Z in this case records contained with the array being looped and inserted 
    AppendQuery = "INSERT INTO TABLE VALUES(X,Z etc....) 
    cmdSQLData.CommandText = AppendQuery 
    cmdSQLData.CommandType = adCmdText 
    cmdSQLData.CommandTimeout = 60 
    Set rs = cmdSQLData.Execute() 

Next 

僞錯誤處理代碼

ErrorHandler: 
If (Len(Err.Description) > 0) Then 
    Debug.Print Err.Description 
End If 

Debug.Print Err.Number 
Debug.Print AppendQuery 

' Create Error Table For Upload and resume Inserting of records 

If (Err.Number = -2147217900) Then 
    runfunc = CreateErrorTable(variables) 

    If runfunc = True Then 
     rowcounter = rowcounter + 1 
    Else: 
     GoTo EndFunction 
    End If 
End If 

EndFunction: 
cn.Close 
Set cn = Nothing 
Set rs = Nothing 
Set cmdSQLData = Nothing 

回答

1

這是一條經驗法則。永遠不要增加For Next控制變量。只有循環應該增加它。當我期望出現錯誤或者當我將錯誤作爲業務邏輯的一部分生成時,我會在代碼體中處理該錯誤。

Sub InsertRows() 

    Dim rowcounter As Long 

    On Error GoTo ErrorHandler 

    For rowcounter = 1 To 10 
     On Error Resume Next 
      'Execute query 
     On Error GoTo ErrorHandler 

     If Err.Number = -2147217900 Then 
      'Append to error table 
     ElseIf Err.Number <> 0 Then 
      Err.Raise Err.Number 'reraise error outside of 'resume next' 
     End If 
    Next rowcounter 

ErrorHandler: 
    'handle other errors 

End Sub 

對我來說,ErrorHandler是用於意外的錯誤。您實際上在邏輯中使用此錯誤來確定該行是否已經存在。如果你期望該行不應該已經存在,那麼將其踢到錯誤處理程序並中止代碼。但是,如果您希望有時該行已經存在,並且確定該行的最有效方式是嘗試插入該行,那麼該錯誤應該由您在代碼體中處理。至少這是我的看法。

+0

嗨迪克,非常感謝您的建議,非常感謝。我有一個與代碼中的錯誤處理有關的小問題。恢復下一次執行的時間到底是什麼時候?它是否搭乘ErrorHandler? –

+0

當程序到達該行時(或者我沒有得到該問題),執行'On Error Resume Next'行。 '在錯誤恢復下一步「*是錯誤處理程序。 「繼續下一步」後遇到的任何錯誤都將被忽略。然後,一旦到達「GoTo ErrorHandler」,任何錯誤都將被重定向到ErrorHandler標籤。基本上有三種類型的錯誤處理:GoTo Label,Resume Next和Go to 0。最後一個關閉錯誤處理,任何錯誤都會暫停程序執行。 –

+0

嗨迪克...我已經添加了代碼恢復似乎取代GoTo ErrorHandler,所以當我得到第二個ID是相同的恢復,但它完全忽略瞭如果Err.Number = -2147217900代碼段。我debug.print和錯誤代碼和數字是正確的,只是沒有被拾起If語句 –