在一个数据透视表中组合查询结果

时间:2016-09-08 16:19:24

标签: excel-vba vba excel

我有一些具有相同结构和不同数据的mdb数据库。我做了一个循环来在所有这些数据库中使用Querytable进行相同的查询。 第一个问题是这个代码为每个mdb创建一个新的Querytable(我在循环后删除它,但我不知道是否有更好的方法)。 第二个问题是所有信息都应该是数据透视表的数据源。当我运行下面的代码时,我遇到了错误,因为"我试图覆盖数据透视表"

你能帮助我吗?我真正需要做的是在一些mdb文件中执行相同的查询,并将数据作为一个数据透视表放在一起

For i = 1 To UBound(strPath)
varConn = "ODBC;DBQ=" + strPath(i) + ";Driver={Microsoft Access Driver (*.mdb)}"
With Worksheets(wksDestino).QueryTables.Add(Connection:=varConn, Destination:=Worksheets(wksDestino).Cells(iLastRow, 1))
    .FieldNames = bHeader
    .CommandText = varSQL
    .RefreshStyle = xlOverwriteCells
    .Refresh BackgroundQuery:=True
    .PreserveColumnInfo = True
    .AdjustColumnWidth = bHeader
End With
iLastRow = Worksheets(wksDestino).Cells(Cells.Rows.Count, "A").End(xlUp).Row + 1
bHeader = False
Next i

问题是这是数据透视表的数据源

2 个答案:

答案 0 :(得分:0)

未经测试 - 这个答案将有助于你的帖子的前半部分。

每次添加新的 QueryTable 之前,您可以将QueryTable变量类型设置为QueryTable,如果它不存在则会添加它。如果QueryTable已经存在,它将只刷新数据。

Dim QryTbl      As QueryTable

' if the QryTbl doesn't exist, create it first
On Error Resume Next
Set QryTbl = Worksheet(wksDestino).QueryTables("My_Query_Table_Name")  ' modify this line according to the name you want to give your Query Table

On Error GoTo 0
If QryTbl Is Nothing Then
      Set QryTbl = Worksheet(wksDestino).QueryTables.Add( _
        Connection:=rstRecordset, _
        Destination:=Range("A1"))
        QryTbl.Name = "My_Query_Table_Name"  ' modify the name according to your needs      
Else
    ' just refresh the QueryTable data
    QryTbl.Refresh True
End If

答案 1 :(得分:0)

如果它们具有相同的列名,您可以组合.CommandText SQL中的表:

SELECT * FROM Table1 IN 'C:\Database1.mdb' UNION ALL
SELECT * FROM Table2 IN 'C:\Database2.mdb' UNION ALL
SELECT * FROM Table3 IN 'C:\Database3.mdb'