使用 VBA 将数据从 Excel 导出到 Access

Posted

技术标签:

【中文标题】使用 VBA 将数据从 Excel 导出到 Access【英文标题】:Export data from Excel to Access using VBA 【发布时间】:2012-06-27 18:22:03 【问题描述】:

我在 Excel 文件中有一个包含一些数据的表,我想使用 VBA 代码将这些数据导出到 Access 上的数据库(在我的数据库中名为 Water Quality 的具体表中)以避免每次打开我的数据库是时候我想介绍更多关于它的数据了。

目前我有这个代码,但它不工作......

Sub Button14_Click()

' Macro purpose: To add record to Access database using ADO and SQL
' NOTE:  Reference to Microsoft ActiveX Data Objects Libary required

' Exports data from the active worksheet to a table in an Access database

'Dim cnt As New ADODB.Connection
'Dim rst As New ADODB.Recordset
Dim cnt As DAO.Database
Dim rst As Recordset
Dim dbPath As String
Dim tblName As String
Dim rngColHeads As Range
Dim rngTblRcds As Range
Dim colHead As String
Dim rcdDetail As String
Dim ch As Integer
Dim cl As Integer
Dim notNull As Boolean
Dim sConnect As String

'Set the string to the path of your database as defined on the worksheet
dbPath = "C:\Documents and Settings\Administrador\Mis documentos\MonEAU\modelEAU Database V.2.accdb"
tblName = "Water Quality"
Set rngColHeads = ActiveSheet.Range("tblHeadings")
Set rngTblRcds = ActiveSheet.Range("tblRecords")

'Set the database connection string here
sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & dbPath & "';"     'For use with *.accdb files
' sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";"     'For use with *.mdb files

'Concatenate a string with the names of the column headings
colHead = " ("
For ch = 1 To rngColHeads.Count
    colHead = colHead & rngColHeads.Columns(ch).Value
    Select Case ch
        Case Is = rngColHeads.Count
            colHead = colHead & ")"
        Case Else
            colHead = colHead & ","
    End Select
Next ch

'Open connection to the database
cnt.Open sConnect
'Begin transaction processing
On Error GoTo EndUpdate
cnt.BeginTrans

'Insert records into database from worksheet table
For cl = 1 To rngTblRcds.Rows.Count
    'Assume record is completely Null, and open record string for concatenation
    notNull = False
    rcdDetail = "('"

    'Evaluate field in the record
    For ch = 1 To rngColHeads.Count
        Select Case rngTblRcds.Rows(cl).Columns(ch).Value

                'if empty, append value of null to string
            Case Is = Empty
                Select Case ch
                    Case Is = rngColHeads.Count
                        rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL)"
                    Case Else
                        rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL,'"
                End Select

                'if not empty, set notNull to true, and append value to string
            Case Else
                notNull = True
                Select Case ch
                    Case Is = rngColHeads.Count
                        rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "')"
                    Case Else
                        rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "','"
                End Select
        End Select
    Next ch

    'If record consists of only Null values, do not insert it to table, otherwise
    'insert the record
    Select Case notNull
        Case Is = True
            rst.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, cnt
        Case Is = False
            'do not insert record
    End Select
Next cl

EndUpdate:
'Check if error was encounted
If Err.Number <> 0 Then
    'Error encountered.  Rollback transaction and inform user
    On Error Resume Next
    cnt.RollbackTrans
    MsgBox "There was an error.  Update was not succesful!", vbCritical, "Error!"
Else
    On Error Resume Next
    cnt.CommitTrans
End If

'Close the ADO objects
cnt.Close
Set rst = Nothing
Set cnt = Nothing
On Error GoTo 0

End Sub

目前,问题是我在调试代码时,出现编译错误:“cnt.Open sConnect”函数上出现“Method or data member not found”。

如果可能,任何帮助将不胜感激。

注意:我使用的是 Office 2010。

【问题讨论】:

现在调试代码时该行出现错误:无效使用新键盘 【参考方案1】:

您的编译错误是由于以下两行:

Dim cnt As DAO.Database
cnt.Open sConnect

DAO.Database 对象没有 .Open 方法,这解释了“找不到方法或数据成员”。错误消息经常会有些含糊,而且不是很有帮助。但是,在这种情况下,我想不出错误信息怎么能更清楚。

还有一些我不明白的地方。 sConnect 看起来像一个 ADO 连接字符串。但是cnt 是一个DAO(数据库)对象。你不能像这样在一个语句中混搭两个对象模型。

你在你的活动变量声明之前有这个:

'Dim cnt As New ADODB.Connection

然后在你的过程中,你有:

'Close the ADO objects
cnt.Close

因此,也许您最初打算将cnt 用作ADO.Connection 对象,并且在将其切换为DAO.Database 对象后没有调整其余代码。

我建议您修改您的代码以理清 DAO 与 ADO 的混淆,然后如果您还有任何问题,请向我们展示新代码。请仅向我们展示重现您希望解决的问题所需的最少测试代码。 TIA 供您考虑。

【讨论】:

谢谢!我可以解决这个问题......正如你所说,DAO和ADO之间存在混淆。现在还有其他问题,首先我必须检查现在失败的地方。【参考方案2】:

我只有 Access 数据库可以打开 excel 文件(而不是相反),但是通过查看我的代码,我认为你应该直接看这个:

`Set cnt = OpenDatabase_
       (dbPath, False, True, "Access 8.0;")

在http://support.microsoft.com/kb/190195 上也发现了这个。

这有帮助吗?

【讨论】:

以上是关于使用 VBA 将数据从 Excel 导出到 Access的主要内容,如果未能解决你的问题,请参考以下文章

VBA 展望。尝试从电子邮件正文中提取特定数据并导出到 Excel

将数据从 Excel 导出到 Access - 错误:参数不是可选的

MS Access导出联合查询到Excel,VBA问题

Excel VBA:将表数据导出到 Access。如果 2 个字段的主键已经存在,如何覆盖?

将特定 Excel 数据从多个字段导出到 Word

VBA 将 excel 单元格数据导出到 .txt 文件中