VBA按查询名称直接为数据透视表添加CubeFields值字段的实现方法
解决方案
方法1:直接捕获GetMeasure返回值(无需依赖度量后缀)
你录制的宏里调用GetMeasure后额外通过带后缀的度量名查找的逻辑是冗余的,GetMeasure方法执行后本身就会返回新创建的CubeField实例,直接接住这个实例添加到数据字段即可,完全不需要关心系统自动分配的后缀名。
示例代码如下:
Dim pt As PivotTable Dim curCubeField As CubeField Set pt = ActiveSheet.PivotTables("PT_Test") ' 按需依次处理每个仓库表的Sales字段 ' 北仓 Set curCubeField = pt.CubeFields.GetMeasure("[Warehouse_North_Data].[Sales]", xlSum, "North Sales") pt.AddDataField curCubeField, curCubeField.Name ' 南仓 Set curCubeField = pt.CubeFields.GetMeasure("[Warehouse_South_Data].[Sales]", xlSum, "South Sales") pt.AddDataField curCubeField, curCubeField.Name ' 其他仓库表按照以上逻辑批量扩展即可,查询数量不定的情况下可以把表名存在数组里循环处理
方法2:提前在PowerPivot模型中创建显式度量
如果你的模型结构相对固定,可以直接在PowerPivot界面为每个仓库表预先创建显式度量,自定义唯一的度量名,比如:
- 北仓度量名:
North_Total_Sales,公式为SUM('Warehouse_North_Data'[Sales]) - 南仓度量名:
South_Total_Sales,公式为SUM('Warehouse_South_Data'[Sales])
后续VBA直接通过你自定义的唯一度量名引用即可,完全不会出现自动加后缀的问题,示例代码:
Dim pt As PivotTable Set pt = ActiveSheet.PivotTables("PT_Test") pt.AddDataField pt.CubeFields("[Measures].[North_Total_Sales]"), "North Sales" pt.AddDataField pt.CubeFields("[Measures].[South_Total_Sales]"), "South Sales"
原代码报错原因说明
PowerPivot自动生成的隐式度量的数字后缀是按度量首次被添加到透视表的顺序分配的,并非按表名的字母顺序,所以手动猜后缀的方式必然会出现偶发报错。
内容的提问来源于stack exchange,提问作者Sgdva
相关产品推荐
相关产品推荐

