如何将存储为Excel VBA程序中的变量的数据传输到Access数据库

时间:2017-08-11 14:20:06

标签: excel vba ms-access

我将来自一系列Excel VBA计算的数据存储为VBA代码中的变量。我想在代码的最后做的是将这些变量中的数据作为新记录传输到MS 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数据库中的相应列以创建新记录?

1 个答案:

答案 0 :(得分: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