Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
使用Excel VBA将表从SQL导入Access_Sql_Excel_Vba_Ms Access - Fatal编程技术网

使用Excel VBA将表从SQL导入Access

使用Excel VBA将表从SQL导入Access,sql,excel,vba,ms-access,Sql,Excel,Vba,Ms Access,我有一个Excel工具,可以对SQL中的数据进行精算计算。该工具将表从SQL导入到我的Excel手册中,然后对数据集进行一些计算 我想从SQL中获取表(我使用CopyFromRecordSet粘贴到电子表格中),并将该表插入Access数据库 Dim acc作为对象 Dim TblName作为字符串,DBName作为字符串,scn作为字符串 Set acc=CreateObject(“Access.Application”) Set rs=New ADODB.Recordset scn=此工作簿

我有一个Excel工具,可以对SQL中的数据进行精算计算。该工具将表从SQL导入到我的Excel手册中,然后对数据集进行一些计算

我想从SQL中获取表(我使用CopyFromRecordSet粘贴到电子表格中),并将该表插入Access数据库

Dim acc作为对象
Dim TblName作为字符串,DBName作为字符串,scn作为字符串
Set acc=CreateObject(“Access.Application”)
Set rs=New ADODB.Recordset
scn=此工作簿。工作表(“轴表”)。范围(“A3”)。值
DBName=此工作簿。工作表(“轴表”)。范围(“B3”)。值
调用CreateConnectionSQL.CreateConnectionSQL
acc.OpenCurrentDatabase ActiveWorkbook.Path&“\”scn&“\Input.accdb”
rs.ActiveConnection=cn
rs.CursorType=adOpenForwardOnly
rs.LockType=adLockReadOnly
rs.Source=“SELECT*FROM”数据库名
美国公开赛
TblName=“SAM”
调用DoCmd.TransferDatabase(TransferType:=acImport_
数据库名称:=rs_
对象类型:=可执行_
来源:=rs.Fields_
目的地:=acc)
rs.Close
调用CreateConnectionSQL.CloseConnectionACC
acc.CloseCurrentDatabase
根据退出
设置acc=无

我尝试了很多方法,花了几十个小时在谷歌上搜索。我假设记录集是Excel中存储数据的虚拟数据库。我想将该数据转储到Access中的新表中。

在工作簿中创建一个名为AXIS的工作表,以便在导入Access之前保存查询结果

选项显式
子副本访问()
Const TABLENAME为String=“AXIS”
Const SHEETNAME As String=“AXIS”'创建此工作表
Const SQL As String=“从表1中选择*
Dim acc作为对象,cn作为ADODB.Connection,rs作为ADODB.Recordset
尺寸rng作为范围,ws作为工作表
Dim sPath为字符串,SADD为字符串,n为长,i为整数
Dim scn作为字符串,dbname作为字符串,dbpath作为字符串
sPath=ThisWorkbook.Path
使用此工作簿。工作表(“轴表”)
scn=.范围(“A3”).值
dbname=.Range(“B3”).Value
以
dbpath=sPath&“\”&scn&“\”&dbname
'连接并查询sql数据库
设置cn=CreateConnectionSQL
Set rs=New ADODB.Recordset
rs.ActiveConnection=cn
rs.CursorType=adOpenForwardOnly
rs.LockType=adLockReadOnly
rs.Source=SQL
美国公开赛
“干净的床单
设置ws=ThisWorkbook.Worksheets(SHEETNAME)
ws.Cells.Clear
'将字段名设置为标题
对于i=1到rs.Fields.Count
ws.Cells(1,i)=rs(i-1).Name
下一个
'将记录集复制到工作表
ws.Range(“A2”).CopyFromRecordset rs
设置rng=ws.Range(“A1”).CurrentRegion
n=rng.Rows.Count-1
sAddr=ws.Name&“!”&rng.AddressLocal
sAddr=Replace(sAddr,“$”,“)”从地址中删除$
MsgBox n&“记录导入到”&sAddr,vb信息
cn.Close
“开放存取
Set acc=CreateObject(“Access.Application”)
acc.OpenCurrentDatabase数据库路径
'清除任何现有表
出错时继续下一步
acc.DoCmd.DeleteObject可执行,TABLENAME
错误转到0
'将工作表导出到access中
acc.DoCmd.Transfer电子表格导入,acSpreadsheetTypeExcel9,表格名称_
sPath&“/”&此工作簿。名称,True,sAddr
”“完了
acc.CloseCurrentDatabase
根据退出
设置acc=无
MsgBox“导出到”&dbpath&“表”&TABLENAME&“完成”,vbInformation
端接头
函数CreateConnectionSQL()作为ADODB.Connection
Const SERVER As String=“SERVER”
Const DB As String=“数据库”
常量UID为String=“user”
Const PWD As String=“password”
作为字符串的Dim sConStr
sConStr=“Driver={SQL Server本机客户端11.0};Server=“&Server&_
“Database=“&DB&”Uid=“&Uid&”Pwd=“&Pwd&;”
'Debug.Print sConStr
设置CreateConnectionSQL=CreateObject(“ADODB.Connection”)
CreateConnectionSQL.Open sConStr
端函数

我假设调用CreateConnectionSQL.CreateConnectionSQL创建到远程数据库的连接,并且您希望将查询结果SELECT*FROM DBName导出到现有本地Access数据库Input.accdb中的新表。对吗?新表的名称应该是什么?谢谢您的回复,是的。我创建了一个可重用的sub,用于调用到sql server的ADO连接。select查询是到sql server的传递,这是一个示例查询,因为实际的查询构建在构建时非常复杂,这是由于重命名列和乘以负数等原因。是的,“Input.accdb”是我要放入该表的本地access数据库。表格的名称应为“AXIS”。在传输到access数据库之前,您是否能够在excel上创建一张表格来暂时保存选择结果?任何字段都是日期,那么它们是什么格式?是的,所以目前我要做的是将信息临时拉入电子表格,然后使用DoCmd.transferspreadsheet将其放入access dbs。我发现这种方法的问题是,与手动将sql表下载到Access中并以我想要的格式查询Access中的表相比,dbs的大小往往要大50%-100%(27mb变为54mb)。