来自多个查询的多维数据集字段作为数据透视值 Table VBA
Cubefields from multiple queries as Values for Pivot Table VBA
背景
基于 PowerPivot 导入,我检索了具有相同信息的多个源以在 excel 内进行操作,并使用数据透视表显示基本计算,在此过程中,我也自动创建 PT 并使用关系来关联字段,然后显示每个表中的值。假设我有两个查询
- "Warehouse_North_Data"
- "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
背景
基于 PowerPivot 导入,我检索了具有相同信息的多个源以在 excel 内进行操作,并使用数据透视表显示基本计算,在此过程中,我也自动创建 PT 并使用关系来关联字段,然后显示每个表中的值。假设我有两个查询
- "Warehouse_North_Data"
- "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