2017-06-16 2 views
0

Aujourd'hui a été une journée d'affouillement YouTube et Internet, et je n'ai pas encore compris comment faire fonctionner ce code. Il ouvre et ferme la connexion sans problème, mais lorsque j'essaie d'écrire dans un jeu d'enregistrements, il ignore complètement tout et ferme la connexion sans entrer de données.Saut de code sur saisie d'un jeu d'enregistrements, ADODB Excel VBA

Const AccessConnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Vision\Database\BVAS.accdb;Persist Security Info=False;" 

Private Sub BtnSave_Click() 

    Dim DbConn As ADODB.Connection 
    Dim Inventory As ADODB.Recordset 
    Dim r As Range 

    Set DbConn = New ADODB.Connection 
    Set Inventory = New ADODB.Recordset 

    DbConn.ConnectionString = AccessConnStr 
    DbConn.Open 
     On Error GoTo CloseConnection 
     With Inventory 
      .ActiveConnection = DbConn 
      .Source = "T3Scaffold_Inventory" 
      .LockType = adLockOptimistic 
      .CursorType = adOpenKeyset 
      .Open 
      On Error GoTo CloseRecordset 
     End With 
      CountSheet.Activate 
       'WTF, why does it skip this ? Research if and IF or Do WHILE statement will work here for so that only the Items with quantity >0 are sent to ACCESS 
        For Each r In .Range("A2", Range("A2").End(xlDown)) 

          With Inventory 
           .AddNew 
           .Fields("ScaffoldID") = Range("ScaffoldID") 
           .Fields("ItemNumber") = Cells(i + 1, 1).Value 
           .Fields("Quantity") = Cells(i + 1, 3).Value 
           .Fields("WorktypeID") = Range("WorktypeID") 
           .Fields("RentStartDate") = Range("Date") 
           .Fields("OnRent?") = "Yes" 
           .Update 
          End With 

        Next r 


CloseRecordset: 
    Inventory.CancelUpdate 
    Inventory.Close 

CloseConnection: 
    DbConn.Close 

Set Inventory = Nothing 
Set DbConn = Nothing 


End Sub 

Merci à tous. J'espère que c'est une solution super compliquée lol. -MC

+0

Donc ça g ets à la ligne commençant par "For Each r in .range", puis passe directement à "CloseRecordset:"? – jamheadart

+0

Je mets un point de rupture à la pour chaque instruction et il saute juste au-dessus. Cela va de 'End With' à 'CloseRecordset:' sans itération à travers la boucle. –

+0

Le fait qu'il saute directement à l'étiquette 'CloseRecordset' suggère que CountSheet.Activate génère une condition d'erreur. Juste avant le 'End With 'vous avez' On Error GoTo CloseRecordset'. Essayez d'ajouter une ligne juste après l'étiquette 'CloseRecordset' pour voir ce que l'erreur est:' MsgBox "Erreur" & Err.Number & "-" & Err.Description' – Skippy

Répondre

0

Votre erreur en raison de

For Each r In .Range("A2", Range("A2").End(xlDown)) 

en cas d'erreur, On Error GoTo CloseRecordset

le code à modifier comme celui-ci

For Each r In Activesheet.Range("A2", Activesheet.Range("A2").End(xlDown)) 

ou

For Each r In Range("A2", Range("A2").End(xlDown)) 
+0

La seule chose que j'ai également dû modifier 'CountSheet.activate' à' Worksheets ("CountSheet"). Activate'. –