16.11 保护数据透视表

众所周知,Excel的“保护工作表”功能可以防止用户修改工作表内容,包括工作表中的数据透视表。如果用户希望仅保护数据透视表,而不保护透视表以外的单元格区域,那么可以利用代码对数据透视表进行多种不同的保护。

16.11.1 限制数据透视表字段的下拉选择

一般情况下,数据透视表的行字段、列字段和筛选字段都会提供下拉按钮,利用这个按钮可以编辑该字段中各项的显示状态。如果不希望其他用户修改这些字段项的显示状态,可以利用代码在用户界面中禁止使用下拉按钮的功能。

示例16.15 限制数据透视表字段的下拉选择

img356

打开示例文件“限制数据透视表字段的下拉选择.xlsm”,工作表中有如图16-33所示的数据透视表,行字段“部门”和列字段“月”所在单元格右侧都有下拉按钮。运行DisableFilter过程后,数据透视表中行字段和列字段的下拉按钮都被隐藏了。

代码解析:

第5行代码到第7行代码循环遍历数据透视表中的字段。

img357a

图16-33 数据透视表字段的下拉选择按钮

第6行代码设置数据透视表字段的EnableltemSelection属性为False,在用户界面中禁止使用下拉按钮的功能。

运行示例文件中的EnableFilter过程,可以恢复数据透视表的下拉按钮功能。

img357b

16.11.2 限制更改数据透视表布局

Excel数据透视表的布局调整虽然可以在【数据透视表字段列表】对话框内通过鼠标拖放来实现,但是在提供了方便性的同时,也使得数据透视表布局很容易被用户的意外操作所破坏,为了保护数据透视表的完整性,可以禁止用户更改数据透视表布局。

示例16.16 限制更改数据透视表布局

img357c

img358a

打开示例文件“限制更改数据透视表布局.xlsm”,在数据透视表中任意单元格(如C6)上单击鼠标右键,在弹出的快捷菜单上可以使用【显示字段列表】命令或者【隐藏字段列表】命令来控制【数据透视表字段列表】对话框的显示状态。在【数据透视表字段列表】对话框中,用户可以非常容易地调整当前数据透视表的布局,如图16-34所示。

img358b

图16-34 数据透视表和【数据透视表字段列表】对话框

运行ProtectPivotTable过程将禁用数据透视表的布局调整功能,Excel窗口中不再显示【数据透视表字段列表】对话框。在数据透视表中的任意单元格(如C6)上单击鼠标右键,弹出的快捷菜单上【显示字段列表】命令已被禁用,如图16-35所示。

img358c

图16-35 禁用【显示字段列表】命令

代码解析:

第4行代码到第12行代码循环遍历数据透视表中的全部字段,分别设置其属性。

第6行代码禁止将该字段拖动到行字段位置上。

第7行代码禁止将该字段拖动到列字段位置上。

第8行代码禁止将该字段拖动到值字段位置上。

第9行代码禁止将该字段拖动到筛选字段位置上。

第10行代码禁止将该字段拖离数据透视表而隐藏该字段。

第13行代码禁止显示数据透视表字段列表。

运行示例文件中的unProtectPivotTable过程将恢复上述被禁用的数据透视表功能。

img359

16.11.3 禁用数据透视表的显示明细数据功能

在工作表中双击数据透视表中的任意单元格,将在工作簿中添加一个新的工作表显示该数据透视表的明细数据,具体操作步骤请参阅示例2.9节。如果构建数据透视表的源数据意外丢失,可以利用这个功能重建数据源。

这个功能为用户带来方便的同时,也带来一个非常棘手的问题,这就是在发布数据透视表时如何保护源数据,使得用户无法随意查看数据透视表的源数据。利用2.9.3小节讲述的方法通过修改数据透视表的相关属性,可以暂时禁用“显示明细数据”功能,但是对于熟悉数据透视表的用户,可以非常容易地修改这个属性,然后获得源数据。

示例16.17 禁用数据透视表的显示明细数据功能

利用工作表的系统事件可以实现禁用数据透视表的显示明细数据功能,即使用户修改数据透视表的相关属性,也无法通过双击数据透视表单元格获得源数据。

“数据透视表”工作表中已经创建了如图16-36所示的数据透视表,双击E12单元格,Excel将在当前工作簿中添加一个新的工作表,并在其中显示数据透视表的全部源数据。

img360a

图16-36 双击数据透视表单元格显示明细数据

步 骤1img01

打开示例文件“禁用数据透视表的显示明细数据功能.xlsm”,单击【安全警告】消息栏上的【启用内容】按钮,如图16-37所示。

img360b

图16-37 启用宏功能

步 骤2img01

双击数据透视表的E12单元格,将显示如图16-38所示的警告信息。单击【确定】按钮关闭警告信息对话框。

img361a

图16-38 数据透视表警告信息框

注意img01

如果在步骤1中未单击【启用内容】按钮,那么示例文件工作簿只显示“提示”工作表,用户无法查看数据透视表。

img361b

代码解析:

第1行代码到第9行代码为工作簿的Open事件代码。

第3行代码显示“数据源”工作表。

第4行代码显示“数据透视表”工作表。

第5行代码隐藏“提示”工作表。

第6行代码到第8行代码遍历“数据透视表”工作表中的数据透视表。

第7行代码修改数据透视表的EnableDrilldown属性,禁用显示明细数据功能。

第10行代码到第15行代码为工作簿的BeforeClose事件代码。

第11行代码显示“提示”工作表。

第12行代码隐藏“数据源”工作表。

第13行代码隐藏“数据透视表”工作表。

运行示例文件中的EnablePvtDrilldown过程可以恢复数据透视表的显示明细数据功能。

img362a