Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用excelvba将数据导出到MS-Access表_Sql_Excel_Ms Access_Vba - Fatal编程技术网

Sql 使用excelvba将数据导出到MS-Access表

Sql 使用excelvba将数据导出到MS-Access表,sql,excel,ms-access,vba,Sql,Excel,Ms Access,Vba,我目前正在使用以下代码将数据从工作表导出到MS Access数据库,该代码在每一行中循环,并将数据插入MS Access表 Public Sub-TransData() Application.ScreenUpdating=False Application.EnableAnimations=False Application.EnableEvents=False Application.DisplayAlerts=False 活动工作簿。工作表(“对开本数据原件”)。激活 调用MakeConn

我目前正在使用以下代码将数据从工作表导出到MS Access数据库,该代码在每一行中循环,并将数据插入MS Access表

Public Sub-TransData()
Application.ScreenUpdating=False
Application.EnableAnimations=False
Application.EnableEvents=False
Application.DisplayAlerts=False
活动工作簿。工作表(“对开本数据原件”)。激活
调用MakeConnection(“fdMasterTemp”)
对于i=1到rcount-1
艾德纽卢比
rs.Fields(“fdName”)=单元格(i+1,1).Value
rs.Fields(“fdDate”)=单元格(i+1,2).值
rs.更新
接下来我
呼叫关闭连接
Application.ScreenUpdating=True
Application.EnableAnimations=True
Application.EnableEvents=True
Application.DisplayAlerts=True
端接头

公共函数将连接(TableName作为字符串)设置为布尔值
'*******与数据库建立连接的例程
Dim DBFullName作为字符串
将cs设置为字符串
DBFullName=Application.ActiveWorkbook.Path&“\FDData.mdb”
cs=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&DBFullName&;”
Set cn=CreateObject(“ADODB.Connection”)
如果不是(cn.State=adStateOpen),则
cn.Open cs
如果结束
Set rs=CreateObject(“ADODB.Recordset”)
如果不是(rs.State=adStateOpen),则
rs.开放表名,cn,adOpenKeyset,ADLOCK
如果结束
端函数

公共函数CloseConnection()为布尔值
'*******关闭与数据库连接的例程
出错时继续下一步
如果不是的话,那么rs什么都不是
rs.Close
如果结束
如果不是,cn什么都不是
cn.Close
如果结束
CloseConnection=True
退出功能
端函数
上面的代码适用于几百行记录,但显然需要导出更多的数据,比如25000条记录,是否可以在不循环所有记录的情况下导出,并且只使用一条SQL INSERT语句一次性将所有数据批量插入Ms.Access表

任何帮助都将不胜感激

编辑:问题已解决

如果有人想了解这方面的信息,我做了大量搜索,发现以下代码对我来说很好,而且由于SQL INSERT,速度非常快,(3秒钟内记录27648条!!!!):

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;数据源=”&dbPath
dsh=“[”&Application.ActiveSheet.Name&“$]”
cn.Open scn
ssql=“插入到fdFolio([fdName]、[fdOne]、[fdTwo])”
ssql=ssql&“从[Excel 8.0;HDR=YES;数据库=”&dbWb&“]”中选择*。&dsh
cn.执行ssql
端接头
仍在努力添加特定字段名,而不是使用“Select*”,尝试了各种方法添加字段名,但目前无法使用

是否可以在不遍历所有记录的情况下导出

对于Excel中具有大量行的区域,如果在Excel中创建
Access.Application
对象,然后使用它将Excel数据导入Access,您可能会看到一些性能改进。下面的代码位于包含以下测试数据的同一Excel文档中的VBA模块中

选项显式
子帐户导入()
Dim acc作为新的访问应用程序
acc.OpenCurrentDatabase“C:\Users\Public\Database1.accdb”
acc.DoCmd.TransferSpreadsheet_
TransferType:=导入_
电子表格类型:=acSpreadsheetTypeExcel12Xml_
TableName:=“tblExcelImport”_
文件名:=Application.ActiveWorkbook.FullName_
HasFieldNames:=True_
范围:=“对开本数据原始$A1:B10”
acc.CloseCurrentDatabase
根据退出
设置acc=无
端接头
@Ahmed

下面是指定要插入MS Access的命名范围中的字段的代码。这段代码的好处在于,您可以在Excel中随意命名字段(如果使用*则字段必须在Excel和Access之间完全匹配),正如您所看到的,我将Excel列命名为“哈哈”,即使Access列被称为“dte”


我使用了代码并得到了错误:“找不到可安装的ISAM”使其正常工作…只需将导入类型更改为5…。非常感谢…)为什么不直接使用DAO和SQL,而不是Access实例?运行此操作需要什么引用?@Fionnuala代码正在使用ADO..CreateObject(“ADODB.Connection”)将创建ADO对象..对于.accdb文件,请使用
scn=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&dbpath
编辑应作为答案发布。我认为使用VBA从Excel甚至文本文件传输数据是最好的方法。只需将连接字符串(例如Excel 8.0)更新为Excel 12.0 Xlm/Excel 12.0,即可获得较新版本的Excel。当然,ACE提供程序相当于JET。@L42谢谢,但我认为有一些限制,poster无法回答自己的问题。.我对ACE使用了相同的查询,我可以选择需要加载的特定行。但我是在64位设备上运行的。我无法复制你和JET之间的问题。但我仍然认为它应该作为答案发布。你最终还是用上了它。:)
Sub test()
    dbWb = Application.ActiveWorkbook.FullName
    dsh = "[" & Application.ActiveSheet.Name & "$]" & "Data2"  'Data2 is a named range


sdbpath = "C:\Users\myname\Desktop\Database2.mdb"
sCommand = "INSERT INTO [main] ([dte], [test1], [values], [values2]) SELECT [haha],[test1],[values],[values2] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh

Dim dbCon As New ADODB.Connection
Dim dbCommand As New ADODB.Command

dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sdbpath & "; Jet OLEDB:Database Password=;"
dbCommand.ActiveConnection = dbCon

dbCommand.CommandText = sCommand
dbCommand.Execute

dbCon.Close


End Sub