2017-07-06 92 views
0

我必須在Excel中創建超過170個命名範圍,我試圖加載到Access表中。以下是我的代碼。Excel導出到Access,通過VBA導致不穩定

Sub Load_To_ALLL_TSD() 

Dim strDatabasePath As String 
Dim oApp As Access.Application 
Dim PathOfworkbook As String 

PathToDB = ThisWorkbook.Path 
strDatabasePath = PathToDB & "\RAROC.accdb" 

Set oApp = CreateObject("Access.Application") 
'Set db = Application.CurrentProject 
oApp.Visible = True 

oApp.OpenCurrentDatabase strDatabasePath 

Set db = CurrentDb() 
Set rs = db.OpenRecordset("ALLL_TSD", dbOpenTable) 

    With oApp 
      With rs 
       .AddNew ' create a new record 
       ' add values to each field in the record 
       .Fields("TSD_Base_Rate_Received") = Range("TSD_Base_Rate_Received").Value 
       .Fields("TSD_Base_Rate_Received_Input") = Range("TSD_Base_Rate_Received_Input").Value 
       .Fields("TSD_Calculated_RAROC") = Range("TSD_Calculated_RAROC").Value 
       .Fields("TSD_Capital_Factor") = Range("TSD_Capital_Factor").Value 

       ' etc, etc, lot more fields and named ranges here 

       ' add more fields if necessary... 
       .Update ' stores the new record 
      End With 
    End With 

Set oApp = Nothing 
MsgBox ("Done! All Data saved to RAROC database!!") 

End Sub 

我收到了一些奇怪的錯誤!如果我使用F8運行代碼,它工作正常。如果我點擊一個按鈕來激活代碼,有時它會起作用,有時它不起作用。我在幾條不同的線路上發生了錯誤。

一旦它扔在這裏的錯誤:

Set rs = db.OpenRecordset("ALLL_TSD", dbOpenTable) 

錯誤讀取「對象變量或沒有設置塊」

一旦說「的Microsoft Access已停止工作」,並在此拋出一個錯誤線。

點域( 「TSD_Base_Rate_Received_Input」)=範圍( 「TSD_Base_Rate_Received_Input」)。價值

我見過的其他一些奇怪的事情了。

我有一個參考設置爲兩種:

Microsoft DAO 3.6 Object Library 
Microsoft Access 14.0 Object Library 

它幾乎好像我建立訪問連接,然後幾乎立刻突然掉線,不知何故。

最後,我沒有窗體或報告,並且數據庫沒有拆分。我現在只有一張桌子,我正在寫信給他。

有人可以幫我嗎?

謝謝!

+0

'設置DB = oApp.CurrentDb()'你不需要爲了將數據加載到表自動訪問雖然:你可以更簡單地使用ADO來做到這一點。例如。 https://stackoverflow.com/questions/32821618/insert-full-ado-recordset-into-existing-access-table-without-loop –

+0

哇。接得好。我嘗試過,但仍然無效。當代碼失敗時,我把它放在立即窗口中:?db.name 我得到'運行時錯誤462:遠程服務器機器不存在或不可用' – ryguy72

回答

3

這是一個沒有使用Access的基本示例。

亟待Microsoft ActiveX數據對象的引用2.x庫

Sub Tester() 

    Dim con As New ADODB.Connection, rs As New ADODB.Recordset 

    con.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
      & "Data Source = " & ThisWorkbook.Path & "\RAROC.accdb" 

    'get an empty recordset to add new records to 
    rs.Open "select * from [ALLL_TSD] where false", con, _ 
      adOpenDynamic, adLockBatchOptimistic 

    With rs 
     .AddNew 
     .Fields("TSD_Base_Rate_Received") = Range("TSD_Base_Rate_Received").Value 
     .Fields("TSD_Base_Rate_Received_Input") = Range("TSD_Base_Rate_Received_Input").Value 
     .Fields("TSD_Calculated_RAROC") = Range("TSD_Calculated_RAROC").Value 
     .Fields("TSD_Capital_Factor") = Range("TSD_Capital_Factor").Value 
     'etc... 
     .UpdateBatch '<< EDIT 
     .Close 
    End With 

    con.Close 
End Sub 
+0

謝謝蒂姆。這看起來應該起作用,但它實際上並沒有做任何事情。 – ryguy72

+0

對不起,我的錯誤應該是'UpdateBatch'而不是'更新' –

+0

它的工作原理!謝謝Tim! – ryguy72