2017-08-11 66 views
0

我將一系列Excel VBA計算中的數據存儲爲VBA代碼中的變量。我想在代碼結尾處做的是將這些變量的數據作爲新記錄傳送到MS Access數據庫中。如何將Excel VBA程序中作爲變量存儲的數據傳輸到Access數據庫

Access數據庫已經存在並準備就緒。在將數據傳輸到Access之前,是否必須將變量中的數據放入工作表上的單元格中?

下面是在VBA代碼中的變量,我想在數據庫中存儲(變量名稱對應於數據庫列標題)

Dim customerName As String 
Dim customerAge As Integer 
Dim customerSpend As Double 

customerName = "Tim" 
customerAge = 26 
customerSpend = 12876 

這是我已經成功的代碼示例迄今爲止寫入嘗試並傳輸數據,但我被困在「範圍」部分,因爲它們是變量,而不是一個單元格區域:

Dim strPath As String 
Dim objAccess As Object 

strPath = "C:\db1.accdb" 
Set objAccess = CreateObject("Access.Application") 
Call objAccess.OpenCurrentDatabase(strPath) 
objAccess.Visible = True 


Call DoCmd.TransferSpreadsheet(acImport, acSpreadsheetTypeExcel12, CustomerDetails, Range) 

我如何將存儲在變量的數據在VBA代碼中插入Access數據庫中的相應列以創建新記錄?

+0

該代碼在Excel中,還是在Access? 'DoCmd.TransferSpreadsheet'是一個Access的東西,但你正在創建一個後期綁定的Access應用程序(爲什麼?)。 'TransferSpreadsheet'不傳輸變量或數據,它*傳輸電子表格*,所以它想要一個'Range'來包含你想要「傳輸」的數據。將變量轉儲到工作表中,傳輸該工作表。 –

+0

或者,爲每個要插入的值創建一個帶有參數的INSERT查詢,然後調用它。有很多方法可以做到這一點。 –

+0

嗨 - 感謝您的建議 - 此代碼旨在在Excel中運行的VBA程序的末尾。然後,我想打開一個Access數據庫並將Excel VBA程序的結果存儲在該數據庫中。 –

回答

1

目前,你是治療Access作爲其MS Office的前端 GUI應用程序,而不是作爲一個關係後端數據庫能夠接收SQL調用。 DoCmd.TransferSpreadsheet是一種Access應用程序方法,需要您不使用的已保存的Excel電子表格。

但是,您可以使用SQL附加查詢將變量值傳遞到Access表中。而不僅僅是Access,像VBA這樣的任何應用層代碼都可以連接到像Access這樣的數據庫,並用SQL追加/更新/刪除表數據。下面用DAO(默認的Access數據庫API)演示瞭如何使用查詢參數化的行業最佳實踐。

Sub RunSQL() 
    Dim objAccess As Object 
    Dim db As Object, qdef As Object 
    Dim strPath As String, strSQL As String 
    Dim customerName As String, customerAge As Integer, customerSpend As Double 

    customerName = "Tim": customerAge = 26: customerSpend = 12876 
    strPath = "C:\db1.accdb"   

    ' OPEN ACCESS APPLICATION 
    Set objAccess = CreateObject("Access.Application") 
    objAccess.OpenCurrentDatabase strPath 

    ' OPEN INTERNAL DATABASE 
    Set db = objAccess.CurrentDb 

    ' PREPARE STATEMENT 
    strSQL = "PARAMETERS [nameparam] TEXT(255), [ageparam] INTEGER, [spendparam] DOUBLE;" _ 
       & " INSERT INTO CustomerDetails ([name], [age], [spend]);" 

    ' BUILD TEMP QUERYDEF 
    Set qdef = db.CreateQueryDef("", strSQL) 

    ' BIND PARAMS TO VARIABLES 
    qdef!nameparam = customerName 
    qdef!ageparam = customerAge 
    qdef!spendparam = customerSpend 

    ' EXECUTE ACTION QUERY 
    qdef.Execute 

    Set qdef = Nothing 
    Set db = Nothing 
    Set objAccess = Nothing 
End Sub 
相關問題