16.14 快速打印数据透视表

16.14.1 单筛选字段数据透视表快速分项打印

前面介绍了如何手工操作实现单个筛选字段数据透视表的数据项打印功能,其实使用VAB代码可以快速地实现类似效果。

示例16.20 单筛选字段数据透视表快速分项打印

打开示例文件“单筛选字段数据透视表快速分项打印.xlsm”,在“数据透视表”工作表中已经创建了如图16-44所示的数据透视表,其筛选字段为“规格型号”,其中共有7个字段项。

img366b

图16-44 单个筛选字段数据透视表

按筛选字段逐项打印数据透视表的代码如下:

img366c

img367a

代码解析:

第7行代码保存筛选字段的当前值,由于本示例中的数据透视表只有一个筛选字段,所以可以直接使用objPvtTbl.PageFields(1)引用数据透视表中的页面字段。CurrentPage属性将返回数据透视表的当前页名称,这个属性仅对筛选字段有效。

第8行代码到第11行代码循环遍历筛选字段中的Pivotltem对象。

第9行代码修改筛选字段的CurrentPage属性。

第10行代码打印“数据透视表”工作表。

第12行代码恢复筛选字段的当前页设置。

运行PrintPvtTblByPageFields过程将按照筛选字段中条目的顺序依次打印7个数据透视表。

注意img01

如果读者的计算机中没有安装任何打印机,PrintOut方法会出现运行时错误。读者可以将代码中的PrintOut方法改为PrintPreview,这样可以利用Excel的打印预览功能查看代码的运行效果。

16.14.2 多筛选字段数据透视表快速分项打印

在复杂的数据透视表中往往会存在多个筛选字段,此时不同筛选字段之间的数据项组合将按照几何级数增长。如果需要对数据透视表进行分项打印,手工操作会非常繁琐,而借助VBA程序可以非常轻松地实现这个要求。

示例16.21 多筛选字段数据透视表快速分项打印

打开示例文件“多筛选字段数据透视表快速分项打印.xlsm”,在“数据透视表”工作表中存在如图16-45所示的数据透视表,其中有3个筛选字段,分别是“规格型号”、“颜色”和“版本号”。

按筛选字段的不同组合来打印数据透视表的代码如下:

img367b

img368a

图16-45 多筛选字段数据透视表

img368b

img369a

代码解析:

第9行代码判断数据透视表中是否有筛选字段,如果当前数据透视表中没有筛选字段,第10行代码将显示图16-46所示的提示消息框,第11行代码将结束打印程序的运行。

img369b

图16-46 提示消息框

第13行代码为动态数组astrCurrentPageFId分配存储空间,用于保存数据透视表筛选字段的当前值。

第14行代码到第16行代码循环遍历数据透视表中的筛选字段。

第15行代码将数据透视表筛选字段的当前值保存到数组astrCurrentPageFId中。

第17行代码到第24行代码循环遍历数据透视表中第一个筛选字段的Pivotltem对象。

第18行代码修改筛选字段的当前值,即CurrentPage属性。

第19行代码判断数据透视表中筛选字段的数量,如果仅有一个筛选字段,第20行代码将打印数据透视表所在的工作表,否则第22行代码将调用PrintPvtTbl过程。

第25行到代码第27行代码用于恢复数据透视表筛选字段的当前值。

第30行代码到第46行代码为PrintPvtTbl过程,该过程有两个参数:objPvtTbl参数是PivotTable对象,iPageFldIndex参数是Integer变量,用于保存当前正在处理的筛选字段序号。

第33行代码中如果IPageFldIndex等于数据透视表中筛选字段的数量,那么当前正在处理的筛选字段为数据透视表中的最后一个筛选字段。

第34行到代码第37行代码循环遍历筛选字段中的Pivotltem对象。

第35行代码修改筛选字段的当前值,即CurrentPage属性。

第36行代码将打印数据透视表所在的工作表。

第38行代码循环遍历结束后将结束当前调用过程。

如果当前正在处理的筛选字段并不是数据透视表中的最后一个筛选字段,第40行代码将遍历该筛选字段中的PivotItem对象,第42行代码再次调用PrintPvt过程实现递归调用。

注意img01

PrintPvt过程是一个递归调用过程,是编程中一种特殊的嵌套调用,过程中包含再次调用自身的代码,因此38行代码只是结束当前的调用过程,并不一定结束整个程序的执行。

运行PrintAIIPvtPages过程,将根据数据透视表中筛选字段的全部数据项组合打印数据透视表,本示例将打印42个(7x3x2)不同的数据透视表。