来自多个查询的多维数据集字段作为数据透视值 Table VBA

Cubefields from multiple queries as Values for Pivot Table VBA

背景

基于 PowerPivot 导入,我检索了具有相同信息的多个源以在 excel 内进行操作,并使用数据透视表显示基本计算,在此过程中,我也自动创建 PT 并使用关系来关联字段,然后显示每个表中的值。假设我有两个查询

  1. "Warehouse_North_Data"
  2. "Warehouse_South_Data"

他们有一个名为“Product”的列,我们希望看到与产品本身相关的汇总操作的“Sales”(因此在表之间创建了关系)

约束条件

我无法将两者合并为一个文件(添加一个说明数据来源的列是没有用的)。

提供的示例只是总结 process/problem,实际上导入了第 n 个查询,轻松克服 10m 行数据,但 power pivot 能够处理。

问题

我还没有找到如何正确检索订单以获得“Warehouse_North_Data”或“Warehouse_South_Data”或“Warehouse_Location_Data”的“销售额”的方法因此 VBA 能够自动创建用户所需的 Pivot Table。

期望结果示例

Rows North Sales South Sales
Product01 10000 12000
Product02 5000 8000

代码

通过使用宏记录器,我得到了以下内容

ActiveSheet.PivotTables("PT_Test").CubeFields.GetMeasure _
    "[Warehouse_South_Data].[Total Sales]", xlSum, _
    "Sum of Total Sales"
ActiveSheet.PivotTables("PT_Test").AddDataField ActiveSheet.PivotTables( _
    "PT_Test").CubeFields("[Measures].[Sum of Total Sales 2]"), _
    "Sum of Total Sales"

所以我假设销售的位置(如示例“2”)将基于查询所在的位置(因为它按字母顺序排序),但事实并非如此,因为我尝试使用第三个位置,让我们说“Warehouse_West_Data”为 3 但这给出了一个错误,因为元素 2 没有加载,有时将 West 分配为位置 2 而不是 3 会产生不希望的效果。重要的是要注意所有查询都是同时创建的。

进一步思考

我尝试将 xlDataField 与上面的代码混合使用,但没有用。

Dim pt As PivotTable
Set pt = ActiveSheet.PivotTables("PT_Test")

With pt
 With .PivotFields("[Warehouse_South_Data].[Total Sales]")
       .Orientation = xlDataField
       .Function = xlSum
       .Name = "Sum of Sales in South"
   End With
   End With

问题

有没有办法从直接引用其名称的查询中构建 Cubefields/DataField 作为“值”,而不必将其作为数字引用(如“代码”块的第一部分所示)?

解决方案
我尝试了另一种方法,效果更好: 我创建了一个函数来检索要使用的 CubeField

Function Return_CubeFieldForTitle(PTToWorkIn As PivotTable, TxtQueryFrom As String, TxtFieldToLoad As String) As CubeField
    Set Return_CubeFieldForTitle = PTToWorkIn.CubeFields.GetMeasure("[" & TxtQueryFrom & "].[" & TxtFieldToLoad & "]", xlSum, "Sum of " & TxtFieldToLoad)
End Function

主代码将能够调用此函数并正确附加查询列,而无需数字:

Sub Test()
Dim CubeFieldForTitle As CubeField
Dim PTToWorkIn as PivotTable
Dim TxtWareHouseAnalyzed as String:TxtWareHouseAnalyzed = "Warehouse_South_Data"
Set PTToWorkIn = Sheets("PT_Test").PivotTables("PT_Test")
With PTToWorkIn 
Set CubeFieldForTitle = Return_CubeFieldForTitle(PTToWorkIn, TxtWareHouseAnalyzed,"Sales")
.AddDataField CubeFieldForTitle, "Sum of Sales at " & TxtWareHouseAnalyzed 
End with
End Sub