2017-08-11 24 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 
相关问题