【发布时间】:2013-04-16 05:25:19
【问题描述】:
我目前正在使用以下代码将数据从工作表导出到 MS Access 数据库,代码循环遍历每一行并将数据插入到 MS Access 表中。
Public Sub TransData()
Application.ScreenUpdating = False
Application.EnableAnimations = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Folio_Data_original").Activate
Call MakeConnection("fdMasterTemp")
For i = 1 To rcount - 1
rs.AddNew
rs.Fields("fdName") = Cells(i + 1, 1).Value
rs.Fields("fdDate") = Cells(i + 1, 2).Value
rs.Update
Next i
Call CloseConnection
Application.ScreenUpdating = True
Application.EnableAnimations = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Public Function MakeConnection(TableName As String) As Boolean
'*********Routine to establish connection with database
Dim DBFullName As String
Dim cs As String
DBFullName = Application.ActiveWorkbook.Path & "\FDData.mdb"
cs = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"
Set cn = CreateObject("ADODB.Connection")
If Not (cn.State = adStateOpen) Then
cn.Open cs
End If
Set rs = CreateObject("ADODB.Recordset")
If Not (rs.State = adStateOpen) Then
rs.Open TableName, cn, adOpenKeyset, adLockOptimistic
End If
End Function
Public Function CloseConnection() As Boolean
'*********Routine to close connection with database
On Error Resume Next
If Not rs Is Nothing Then
rs.Close
End If
If Not cn Is Nothing Then
cn.Close
End If
CloseConnection = True
Exit Function
End Function
上面的代码适用于几百行记录,但显然它会导出更多数据,比如 25000 条记录,是否可以在不循环所有记录的情况下导出,只需一条 SQL INSERT 语句即可将所有数据批量插入到Ms.Access Table 一口气?
任何帮助将不胜感激。
编辑:问题已解决
如果有人寻求此信息,我已经进行了大量搜索,发现以下代码对我来说可以正常工作,并且由于 SQL INSERT,它真的很快,(27648 条记录只需 3 秒! !!!):
Public Sub DoTrans()
Set cn = CreateObject("ADODB.Connection")
dbPath = Application.ActiveWorkbook.Path & "\FDData.mdb"
dbWb = Application.ActiveWorkbook.FullName
dbWs = Application.ActiveSheet.Name
scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
dsh = "[" & Application.ActiveSheet.Name & "$]"
cn.Open scn
ssql = "INSERT INTO fdFolio ([fdName], [fdOne], [fdTwo]) "
ssql = ssql & "SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh
cn.Execute ssql
End Sub
仍在努力添加特定字段名称而不是使用“选择 *”,尝试了各种添加字段名称的方法,但暂时无法使用。
【问题讨论】:
-
@Fionnuala 代码正在使用 ADO..CreateObject("ADODB.Connection") 将创建 ADO 对象..
-
对于 .accdb 文件,使用
scn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath -
编辑应该作为答案发布。我认为这是从 Excel 甚至使用 VBA 从文本文件传输数据的最佳方式。只需要更新连接字符串,例如 Excel 8.0 到 Excel 12.0 Xlm / Excel 12.0 以获取更新版本的 Excel。当然还有与 JET 相当的 ACE 提供程序。
-
@L42 谢谢,但我认为有一些限制,发帖人无法回答自己的问题..
-
我对 ACE 使用了相同的查询,我可以选择需要加载的特定行。但是,是的,我在 64 位设备上运行。我无法复制您在使用 JET 时遇到的问题。但我仍然认为它应该作为答案发布。你最终还是使用了它。 :)