楼主 皮皮1998 |
答题期限】2010年1月20日12:00时截稿(以回帖时间为准),欢迎大家踊跃参与。 【题目】 有时我们会根据透视表来查看某些项目的相关数据,这时,我们就会在透视表的数据区域双击,来产生数据表,但是这些数据表我们并不想保存它,题目要求:工作簿关闭后不保留因双击透视表的数据区域产生的所有数据表! 【要求】 1.用VBA编程来完成; 2.关闭该工作簿自动删除因双击透视表的数据区域所产生的所有透视表; 3.具体请参见动画. 【评分】 1、实现功能(如动画所示)可以获得3~4个技能分 自动删除透视表所产生数据表1.rar |
2楼 amulee |
全部放在工作簿Thisworkbook模块中 '设定公共变量。 Dim arrSht() As Worksheet '工作表名称数组,用以记录数据透视表所产生的工作表。 Dim blnOnClick As Boolean '逻辑值标志。记录是否双击了数据透视表区域 '工作簿关闭时删除所有记录的对象 Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Dim i& '关闭警告提示 Application.DisplayAlerts = False '删除所有记录的对象 For i = 1 To UBound(arrSht) arrSht(i).Delete Next i ThisWorkbook.Save '既然删除了就得保存一下吧 '恢复警告提示 Application.DisplayAlerts = True End Sub '当增加工作表事件是通过双击透视表触发时,记录工作表名 Private Sub Workbook_NewSheet(ByVal Sh As Object) If blnOnClick Then ReDim Preserve arrSht(0 To UBound(arrSht) + 1) '增加数据 Set arrSht(UBound(arrSht)) = Sh '增加一个对象的记录 blnOnClick = False '双击标志归为否 End If End Sub '工作簿打开时初始化 Private Sub Workbook_Open() ReDim arrSht(0 To 0) End Sub '判断双击事件时,是否双击了透视表区域 Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim objPivot As Object '遍历该工作簿所有数据透视表 For Each objPivot In Sh.PivotTables 'DataBodyRange是数据透视表的数据区域。双击该区域则会产生明细数据的工作表 'Target是当前双击的区域 '判断当前双击的区域和数据透视表数据区域是否有重合 '若有重合,则将标志设定为True,意味着双击了数据透视表的数据区域 If Not Application.Intersect(Target, objPivot.DataBodyRange) Is Nothing Then blnOnClick = True Exit Sub '由于双击事件只能在一个数据透视表中产生,所以找到就退出过程 End If Next End Sub |
3楼 棉花糖 |
这个方法挺实用的,基本上达到要求。有些细节就没做了,比如关闭工作簿是无论点击什么都会删除表格。 自动删除透视表所产生数据表1.rar |
4楼 皮皮1998 |
这个是回复棉花糖老师代码中没考虑到的方面: 上面二位老师基本完成了动画的要求,如果二位老师的代码加一合并就更完美! |