2016-08-03 163 views
2

我當前使用Microsoft Office 2007並已將Access 2007數據庫鏈接到Excel 2007數據庫。到現在爲止還挺好。我可以更新Access數據庫並在Excel文件中自動顯示。這是我遇到問題的地方。VBA Excel-Access 3251運行時錯誤

當我嘗試從Excel內更新Access數據庫時;我不斷收到運行時3251錯誤。 =>運行時錯誤現在已解決,但在嘗試添加數據時,有關NULL值的新問題?

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 

我使用的當前參考庫是Active X Data Objects 2.1庫。

+1

什麼是錯誤?它是否在更新? – dbmitch

+0

對不起,它的「.add新」或至少這是突出顯示的行 錯誤是3251錯誤,它說 「當前記錄集不支持更新。這可能是提供商的限制,或所選的鎖類型「 –

+0

我討厭ado與訪問數據庫。但是,如果您不想使用DAO,請嘗試使用adoopendynamic而不是鍵盤集打開。在.open之後檢查RS.updatable屬性,以確保您的記錄可以更新。 ID是主鍵字段嗎? – dbmitch

回答

1

ANSWER

確定這樣的問題是我正在嘗試一個新的記錄「添加」到數據庫

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

這是這樣我就可以挽救一個記錄時運行時錯誤Excel電子表格放入Access數據庫(Office 2007)。

我在Excel中打開連接選項選中了我的連接的屬性,並將模式更改爲以下「; Mode = Share Deny None!」。

所以現在我的連接字符串看起來是這樣的:

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 

我再有第二個問題,當我返回一個錯誤,說明我試圖返回的數據給了一個「NULL」值。這是因爲我試圖將數據保存在返回錯誤的數據庫中的主鍵。

我只是註釋掉了這一行,這解決了這個問題。

我也改變了參考 Microsoft ActiveX數據對象6.1庫

1

想我會表現出一個DAO的選擇 - 這是默認的數據庫與較新的Access版本,現在的方法。正如我在代碼中指出的那樣,它需要參考Microsoft Office 14.0 Access database engine Object Library或現在系統上的任何版本。

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