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

时间:2019-04-24 15:20:31

标签: excel ms-access select powerquery

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

在Internet上搜索,我发现了一种使用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

2 个答案:

答案 0 :(得分:0)

使用对单个mdb文件的访问权限来“连接”所有数据,并使用它来完成其余工作会容易得多。

答案 1 :(得分: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