如何在MS Access数据透视表中添加基于总计的Minutes Per Page计算列?
在MS Access数据透视表中添加全局计算的“Minutes Per Page”列
我明白你要的是基于全局总分钟数和总页数的计算结果(40/20=2.00),而不是透视表默认的逐行分钟数除以页数——这个坑确实容易踩,毕竟Access透视表的默认计算字段都是行级的。下面给你两种实用的解决办法:
方法一:修改数据源(推荐,无需代码)
既然要全局计算,不如先在查询层面把全局总计值算出来,再喂给透视表:
- 先建一个聚合查询,算出你的全局总分钟和总页数:
SELECT Sum(Minutes) AS TotalMinutes, Sum(Pages) AS TotalPages FROM YourActualTableName; -- 替换成你的表名 - 再建一个联合查询,把原表数据和上面的聚合结果交叉连接(这样每一行都会带上全局的总计值):
SELECT t.*, agg.TotalMinutes, agg.TotalPages FROM YourActualTableName AS t, (SELECT Sum(Minutes) AS TotalMinutes, Sum(Pages) AS TotalPages FROM YourActualTableName) AS agg; - 用这个联合查询作为数据透视表的数据源,然后添加计算字段:
TotalMinutes / TotalPages,命名为“Minutes Per Page”。这样不管透视表怎么分组,这个字段的值都会是2.00,完全符合你的需求。
方法二:用VBA在透视表中直接计算(适合不想改数据源的情况)
如果不想折腾数据源,也可以用VBA获取透视表的总计值来计算:
- 打开包含透视表的窗体,按
Alt+F11进入VBA编辑器; - 在窗体的
Load事件里添加以下代码(注意替换字段名称和控件名):Private Sub Form_Load() Dim pt As PivotTable Dim totalMinutes As Double Dim totalPages As Double Set pt = Me.PivotTable ' 如果你的透视表控件有自定义名称,比如PivotTable1,就改成Me.PivotTable1 ' 从透视表的总计行获取全局值 totalMinutes = pt.DataFields("Minutes").Total totalPages = pt.DataFields("Pages").Total ' 添加计算字段并放到数据区域 pt.CalculatedFields.Add "Minutes Per Page", totalMinutes / totalPages pt.PivotFields("Minutes Per Page").Orientation = xlDataField End Sub - 保存代码后,重新打开窗体,透视表就会自动添加正确的“Minutes Per Page”列了。
小提醒
- 方法一的优势是计算结果会随数据源实时更新,不需要维护代码;
- 方法二需要确保透视表中已经把
Minutes和Pages作为数据字段添加进去,不然代码会报错。
内容的提问来源于stack exchange,提问作者VeeEss
相关产品推荐
相关产品推荐

