微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 VBA 从 EXCEL 导出到 Access

如何解决使用 VBA 从 EXCEL 导出到 Access

我在网上找到了这段代码,用于将数据从 Excel 导出到 Access,它在一定程度上工作正常,但我在尝试导出一系列单元格时遇到问题。我可以导出一个单元格,但在尝试导出一个范围时它不喜欢。相反,我尝试使用循环来导出范围,但仍然无法使其正常工作。

我得到 Next 没有错误

我试过这个方法也没有运气 'rs!Column1 = Sheets("Sheet1").Range("O2:O170")

代码如下:

Sub AdddNewDatatoAccDb()

Dim cn As ADODB.Connection,rs As ADODB.Recordset

Dim i As Integer

Set cn = New ADODB.Connection

 With cn
.ConnectionString = con1
.Open "T:\Folder1\VBA Test.accdb"
End With


Set rs = New ADODB.Recordset
rs.Open "VBAtest",cn,adOpenDynamic,adLockpessimistic,adCmdTable

For i = 0 To 170

With rs

.AddNew

rs!Column1 = Worksheets("Sheet1").Cells(i + 2,0).Value

rs!Column2 = Worksheets("Sheet1").Cells(i + 2,1).Value

Next i
End With

Set rs = nothing
cn.Close
Set cn = nothing

Exit Sub
End Sub
`

解决方法

您的代码没有按照发布的方式编译。您的 with 块在循环内开始但在循环外结束,这是无效的。您错过了 .Update 之后的 .AddNew 调用。如果我们将字段和值传递给 .AddNew 命令,那么我们不需要 .Update

我建议使用 With 块来控制对象的范围,而不是将它们设置为空。总是在 End With 之前关闭。请注意,我使用错误处理程序来确保始终调用 close。这应该允许优雅地销毁您的数据库对象。

这是我无法测试的示例。您可能需要进行一些调整以使其适合您的环境:

Option Explicit

Public Sub AdddNewDatatoAccDb(ByVal con1 As String)

    On Error GoTo errHandler

    With ADODB.Connection
        .ConnectionString = con1
        .Open "T:\Folder1\VBA Test.accdb"
        With ADODB.Recordset
            .Open "VBAtest",.ConnectionString,adOpenDynamic,adLockPessimistic,adCmdTable
            Dim i As Long
            For i = 0 To 170
                .AddNew "Column1",Worksheets("Sheet1").Cells(i + 2,0).Value
                .AddNew "Column2",1).Value
            Next i

errHandler:            
            .Close
        End With
        
        .Close
    End With

End Sub
,

假设您安装了 MSAccess.exe(即 Office 软件),请考虑使用 SQL 直接从 Access 查询 Excel 工作簿。无需循环。

下面包括两种不同的方式,它们都别名为 t 并假设标头在指定范围内。您可以将它们保存为 Access 中的存储查询供以后使用,甚至可以合并到附加查询中。

SELECT t.*
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook.xlsx][Sheet1$O2:O170] AS t;
SELECT t.*
FROM [Sheet1$O2:O170] As t IN 'C:\Path\To\Workbook.xlsx'[Excel 12.0 Xml;HDR=Yes];
,
Option Explicit

Sub AdddNewDatatoAccDb()

    Const DB = "T:\Folder1\VBA Test.accdb"
    Const TABLE = "VBAtest"

    Dim cn As ADODB.Connection,rs As ADODB.Recordset
    Dim ar,i As Integer
    Dim fields(1),values(1)
    
    Set cn = New ADODB.Connection
    With cn
        .ConnectionString = "Provider=Microsoft.ace.OLEDB.12.0;Data Source=" & DB
        .Open
    End With

    Set rs = New ADODB.Recordset
    rs.Open TABLE,cn,adCmdTable

    ar = Worksheets("Sheet1").Range("O2:P172").Value
    fields(0) = "Column1"
    fields(1) = "Column2"

    For i = LBound(ar) To UBound(ar)
        values(0) = ar(i,1)
        values(1) = ar(i,2)
        rs.AddNew fields,values
    Next i
   
    Set rs = Nothing
    cn.Close
    MsgBox i - 1 & " records inserted",vbInformation
End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。