16.13 多个数据透视表联动

在实际应用中,如果需要在一个工作簿内保存多个具有相同布局的数据透视表,为了保持位于不同工作表中的数据透视表的一致性,用户不得不逐个修改数据透视表的布局或者显示内容。利用数据透视表对象的系统事件代码,可以实现在一个数据透视表更新时,相应更新其他的多个数据透视表,进而保持所有数据透视表的一致性。

示例16.19 多个数据透视表联动

打开示例文件“多个数据透视表联动.xlsm”,在“数据透视表1”和“数据透视表2”工作表有如图16-40所示的数据透视表,两个数据透视表布局和显示的内容完全相同。

img363b

图16-40 两个数据透视表保持同步

步 骤1img01

单击工作表“数据透视表1”中数据透视表筛选字段的下拉按钮,在弹出的“科目划分”下拉列表框中单击“出差费”,单击【确定】按钮关闭下拉列表。

步 骤2img01

单击行字段“月”的下拉按钮,取消勾选“01”项的复选框,单击【确定】按钮关闭下拉列表,如图16-41所示。

img364a

图16-41 调整数据透视表筛选字段和列字段

步 骤3img01

单击工作表标签选中“数据透视表2”工作表,其中的数据透视表也已经进行了同步更新,如图16-42所示。

img364b

图16-42 两个数据透视表同步更新

本示例的事件代码如下:

img364c

img365

代码解析:

本示例代码利用工作簿对象的数据透视表更新事件保持两个数据透视表的同步更新,工作簿中的任意透视表被更新时都会触发此事件,执行预先定义事件代码。

第1行代码用于声明工作簿对象的SheetPivotTableUpdate事件过程,其中Sh参数代表数据透视表所在的工作表对象,Target参数代表被更新的数据透视表对象。

第5行代码禁止屏幕更新,可以提高代码的执行效率。

第6行代码禁止系统事件激活,防止系统事件被重复触发导致死循环。

第7行代码循环遍历工作簿中的全部工作表。

第8行代码判断objSht变量代表的工作表是否为“数据源”或者数据透视表所在的工作表。

第10行代码保存工作表中透视表的名称。

第11行代码清除数据透视表区域,在本行代码中需要使用TableRange2属性而不是TableRangel属性。

第13行代码将透视表拷贝到objSht变量代表的工作表中。

第14行代码恢复数据透视表的名称,以保证原有代码中对于该数据透视表的名称引用仍然有效。

第17行代码和第18行代码释放对象变量所占用的系统资源。

第19行代码恢复系统事件的响应机制。

第20行代码恢复屏幕更新。

注意img01

事件代码必须放置于指定模块中才可正常运行,例如本示例的代码是工作簿对象的SheetPivotTableUpdate事件,那么就应放置于“ThisWorkbook”模块中,如图16-43所示。

img366a

图16-43 ThisWorkbook模块中的事件代码