问题描述
我在网上找到了这段代码,用于将数据从 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