2016-08-03 3 views
2

Actuellement, j'utilise Microsoft Office 2007 et j'ai lié une base de données Access 2007 à la base de données Excel 2007. Jusqu'ici tout va bien. Je peux mettre à jour la base de données d'accès et cela s'affiche automatiquement dans le fichier Excel. Voici où j'ai le problème.Erreur d'exécution VBA Excel-Access 3251

Lorsque j'essaie de mettre à jour une base de données Access à partir d'Excel; Je continue d'obtenir l'erreur d'exécution 3251. => Erreur d'exécution maintenant résolue mais NOUVEAU problème concernant une valeur NULL lorsque j'essaie d'ajouter des données?

Sub ADODBExcelToAccess() 
'Collecting data from the 
    Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long 

    '---NOTE: Sheet is set to auto refresh data from the database on loading--- 

    ' connect to the Access database 
    Set cn = New ADODB.Connection 
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _ 
      "Data Source=" & Application.ActiveWorkbook.Path & "\linktest.accdb;" 

    ' open a recordset (i.e. a table) 
    Set rs = New ADODB.Recordset 

    rs.Open "linktest", cn, adOpenKeyset, adLockOptimistic, adCmdTable 

    ' all records in a table 
    For i = 4 To 16 
     x = 0 

     Do While Len(Range("K" & i).Offset(0, x).Formula) > 0 
      With rs 
       'create a new record 
       .AddNew 
       .Fields("ID") = Range("A1" & i).Value 
       .Fields("PriceID") = Range("B1").Value 
       .Fields("ProductCode") = Range("C1").Value 
       .Fields("Price") = Range("D1" & i).Value 
       .Fields("CurrencyType") = Range("E1").Value 
       .Fields("Type") = Range("F1").Value 
       .Fields("Production") = Range("G1" & i).Value 
       .Fields("Quantity") = Range("H1" & i).Value 
       .Fields("Details") = Range("I1" & i).Value 
       .Fields("DateUpdated") = Range("J1" & i).Value 
       .Fields("Setup") = Range("K1" & i).Value 

       ' stores the new record 
       .Update 

      End With 
      x = x + 1 
     Loop 
    Next i 
    rs.Close 
    Set rs = Nothing 
    cn.Close 
    Set cn = Nothing 
End Sub 

La bibliothèque de référence que j'utilise actuellement est Active X Data Objects 2.1 Library.

+1

Quelle est la ligne d'erreur? Est-ce sur la mise à jour? – dbmitch

+0

Désolé c'est sur le ".addNew" ou au moins c'est la ligne qui devient en surbrillance L'erreur est l'erreur 3251 et il indique "Le jeu d'enregistrements actuel ne supporte pas la mise à jour, cela peut être une limitation du fournisseur, ou de le type de verrouillage sélectionné " –

+0

Je déteste ado avec des bases de données d'accès. Mais si vous ne voulez pas utiliser DAO essayez d'ouvrir avec adoopendynamic au lieu de keyset. Vérifiez la propriété RS.updatable juste après .open pour vous assurer que vous avez enregistré peut être mis à jour. L'identifiant est-il un champ clé primaire? – dbmitch

Répondre

1

RÉPONSE

OK si la question a été je recevais une erreur d'exécution lorsque vous essayez de « Ajouter » un nouvel enregistrement à une base de données avec

Do While Len(Range("K" & i).Offset(0, x).Formula) > 0 
     With rs 
      'create a new record 
      .AddNew 
      .Fields("ID") = Range("A1" & i).Value ... 

C'était si je pouvais enregistrer les enregistrements d'un Feuille de calcul Excel dans une base de données Access (Office 2007).

J'ai ouvert l'option de connexions dans Excel slectionné les propriétés de ma connexion et changé le mode à la suivante "; Mode = Partager Refuser Aucun!"

Alors maintenant, ma chaîne de connexion ressemble à ceci:

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data 
Source=C:\linktest.accdb;Mode=Share Deny None;Extended Properties=""; 
Jet OLEDB:System database=""; 
Jet OLEDB:Registry Path="";Jet OLEDB:Engine Type=6; 
Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2; 
Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB: 
New Database Password="";Jet OLEDB:Create System Database=False; 
Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False; 
Jet OLEDB:Compact Without Replica Repair=False; 
Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False 

J'ai alors eu un deuxième problème lorsque je suis retourné une erreur indiquant que les données que je tentais de revenir a une valeur « NULL ». C'était parce que j'essayais de sauvegarder des données sur la clé primaire de la base de données qui renvoyait l'erreur. J'ai simplement commenté cette ligne et cela a résolu ce problème.

J'ai aussi changé la référence à Microsoft ActiveX Data Objects 6.1 Library

1

Je pensais que je voudrais montrer une alternative DAO - c'est la méthode db par défaut maintenant avec les nouvelles versions d'accès. Comme je l'ai noté dans le code, il faut une référence à Microsoft Office 14.0 Access database engine Object Library ou quelle que soit la version que vous avez sur votre système maintenant.

Option Explicit 

Sub DAOExcelToAccess() 
    ' Requires Reference To 
    ' Microsoft Office 14.0 Access database engine Object Library 

    Dim db  As DAO.Database 
    Dim rs  As DAO.Recordset 
    Dim strFile As String 
    Dim i  As Integer 
    Dim x  As Integer 

    strFile = Application.ActiveWorkbook.Path & "\linktest.accdb" 
    Set db = DBEngine.OpenDatabase(strFile) 
    Set rs = db.OpenRecordset("linktest", dbOpenDynaset) 
    With rs 
     For i = 4 To 16 
      x = 0 

      ' repeat until first empty cell in column A 
      Range("A2").Activate 

      'create a new record 
      .AddNew 
      ' Remove ID if it is AutoIncrement field 
      ' .Fields("ID") = Range("A1" & i).Value 
      .Fields("Area") = "Test" & i 
      .Fields("ProductCode") = Range("C1").Value 
      .Fields("Price") = Range("D1" & i).Value 
      .Fields("CurrencyType") = Range("E1").Value 
      .Fields("Type") = Range("F1").Value 
      .Fields("Production") = Range("G1" & i).Value 
      .Fields("Quantity") = Range("H1" & i).Value 
      .Fields("Details") = Range("I1" & i).Value 
      .Fields("DateUpdated") = Range("J1" & i).Value 
      .Fields("Setup") = Range("K1" & i).Value 

      ' stores the new record 
      .Update 

      x = x + 1 
     Next i 

     .Close 
    End With 
End Sub