在excel中如何使用vba实现将sql的数据快速写入excel
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在excel中如何使用vba实现将sql的数据快速写入excel相关的知识,希望对你有一定的参考价值。
如题,将sql数据库的内容全部写入到excel的当前打开的工作表中,数据量较大,求快速写入的代码
Dim conn As New ADODB.ConnectionconnStr = "Driver=SQL Server;DataBase=test;Server=(local);UID=sa;PWD=123"
conn.Open connStr '连接数据库
Dim rs As New Recordset
sql = "select * from a" '查看表a
rs.Open sql, conn, 3, 3
if Not rs.EOF then
For iCols = 0 To rs.fields.Count - 1
Sheets(1).Cells(1, iCols + 1).Value = rs.fields(iCols).Name
Next iCols
Sheets(1).Cells(2, 1).CopyFromRecordset rs
endif 参考技术A 不用代码,可直接导入
如何使用sql语句和vba将数据从MS-Access导入excel power查询?
在我工作的公司中,有一个文件夹,其中包含许多由系统生成的访问数据库文件。它们具有相同的结构但数据不同。我正在尝试构建一个Excel工具来比较和分析其中一些使用电源查询(连接到工作簿数据模型并使用DAX)。将使用该系统的人不熟悉vba,电源查询(我也不熟悉)或SQL语句。所以,我想要做的是编写一个vba函数来允许人们选择他们想要分析的文件,然后使用这些数据更新工作簿电源查询。电源查询源数据应该是SQL语句。
我正在使用“公式”属性来进行所需的所有更改(实际上,新数据源文件,附加带有文件名的列,并将结果附加到其他数据源文件(如果选择了多个)。下面的代码可以工作,如果我导入一个表,但我无法使用SQL语句。我试图改变一些Access.Database参数,如使用Query =“Select XXX”而不是Item =“TableXXX”但它没有用。我发现了一些关于使用ODBC的信息,但我不想使用ODBC,因为在我看来,该工具可以导致许多连接处理(打开和删除)用户决定更改数据源。
下面是一个只有两个数据源文件的“公式”属性的例子。我没有写循环来构建字符串strSource,因为我没有问题。我想问题是在Access.Database中使用SQL语句。谢谢您的帮助。
strSource = "let
Fonte = Access.Database(File.Contents("PathNameFile01Name.mdb")),
_TbEx_1 = Fonte{[Schema="",Item="TableExample"]}[Data],
_TbEx_C1 = Table.AddColumn(_TbEx_1, "Case", each "File01Name", type text),
Fonte_2 = Access.Database(File.Contents("PathNameFile02Name.mdb")),
_TbEx_2 = Fonte_2{[Schema="",Item="TableExample"]}[Data],
_TbEx_C2 = Table.AddColumn(_TbEx_2, "Case", each "File02Name", type text),
_TbExComb = Table.Combine({_TbEx_C1 , _TbEx_C2})
in
_TbExComb"
ActiveWorkbook.Queries("PwQry01").Formula = strSource
ThisWorkbook.Connections("Qry-PwtQry01").Refresh
在互联网上搜索,我发现了一种使用SQL语句的方法,但问题是在同一个电源查询中组合不同文件的连接。按照我发现的代码,但我认为“公式”属性更接近最终答案。
cnString = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
"PathNameFile01Name.mdb;Mode=Read"
ThisWorkbook.Connections.Add2 _
Name:="MyConnect", _
Description:="Testing connection", _
ConnectionString:=cnString, _
CommandText:="SELECT * FROM TableExample", _
lCmdtype:=XlCmdType.xlCmdSql, _
CreateModelConnection:=True, _
ImportRelationships:=True
天真,我希望看到的是:
strSource = "let
Fonte = Access.Database(File.Contents("PathNameFile01Name.mdb")),
_TbEx_1 = Fonte{[Schema="",Query="SELECT XXXXX"]}[Data],
_TbEx_C1 = Table.AddColumn(_TbEx_1, "Case", each "File01Name", type text),
Fonte_2 = Access.Database(File.Contents("PathNameFile02Name.mdb")),
_TbEx_2 = Fonte_2{[Schema="",Query="SELECT XXXX"]}[Data],
_TbEx_C2 = Table.AddColumn(_TbEx_2, "Case", each "File02Name", type text),
_TbExComb = Table.Combine({_TbEx_C1 , _TbEx_C2})
in
_TbExComb"
ActiveWorkbook.Queries("PwQry01").Formula = strSource
ThisWorkbook.Connections("Qry-PwtQry01").Refresh
使用Access对单个mdb文件“连接”所有数据并使用它来完成剩下的工作会容易得多。
我按照@Wedge的建议并使用了ODBC方法。为了使它工作,我创建了一个ODBC,没有与Windows ODBC数据源关联的ms-access文件。在Excel中,用户选择他想要分析的文件,此信息是strPath()变量。使用循环,所有文件都包含在Formula属性中。变量tpPQSQLMap是一个自定义类型(我相信可能是一个字典),其中strPQNames为查询名称,strPQSQL为SQL语句。遵循最终代码
For pq = 1 To ThisWorkbook.Queries.Count
strSource = ""
strSrcComb = ""
For k = 1 To UBound(strPath)
strSource = strSource + "SourceC" + CStr(k) + "=Odbc.Query(""dbq=" + strPath(k) + ";dsn=MyODBC"", """ + tpPQSQLMap(pq).strPQSQLs + """), " + vbCrLf
strSrcComb = strSrcComb + "SourceC" + CStr(k) + ","
Next k
strSrcComb = Left(strSrcComb, Len(strSrcComb) - 1)
strSource = "let " + vbCrLf + strSource + "Final = Table.Combine({" + strSrcComb + "}) " + vbCrLf + "in " + vbCrLf + "Final "
ThisWorkbook.Queries(pq).Formula = strSource
ThisWorkbook.Connections("Query - " + tpPQSQLMap(pq).strPQNames).Refresh
Next pq
以上是关于在excel中如何使用vba实现将sql的数据快速写入excel的主要内容,如果未能解决你的问题,请参考以下文章
使用vba程序,实现excel数据库模板生成sql数据库结构
使用vba程序,实现excel数据库模板生成sql数据库结构