如何使用sql语句和vba将数据从MS-Access导入excel power查询?

问题描述 投票:1回答:2

在我工作的公司中,有一个文件夹,其中包含许多由系统生成的访问数据库文件。它们具有相同的结构但数据不同。我正在尝试构建一个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("PathName\File01Name.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("PathName\File02Name.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=" & _
        "PathName\File01Name.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("PathName\File01Name.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("PathName\File02Name.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

excel ms-access select powerquery
2个回答
0
投票

使用Access对单个mdb文件“连接”所有数据并使用它来完成剩下的工作会容易得多。


0
投票

我按照@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

推荐问答