【理解】多筛选字段数据透视表快速分项打印里面的递归用法
2015-02-05 16:04
489 查看
还是被这个递归,以及各种复杂的名称搞得晕头转向,不得不记录一下理解的过程。方便以后的应用。其实关键不在于实现这个事件,而在于代码的思路。
打印效果:
理解起来无非是,递归不停压东西入栈(去到
Sub PrintPvtTblblByMultiPageFlds() Dim objPvtTbl As PivotTable Dim objPvtTblFld As PivotField Dim objPvtTblIm As PivotItem Dim i As Integer Dim m As Integer Dim astrCurrentPageFld() As String Set objPvtTbl = Sheets("数据透视表").PivotTables(1) With objPvtTbl If .PageFields.Count = 0 Then MsgBox "当前数据透视表中没有筛选字段!", vbInformation, "提示" Exit Sub End If m = .PageFields.Count ReDim astrCurrentPageFld(1 To .PageFields.Count) For i = 1 To .PageFields.Count astrCurrentPageFld(i) = .PageFields(i).CurrentPage Next For Each objPvtTblIm In .PageFields(1).PivotItems .PageFields(1).CurrentPage = objPvtTblIm.Name ' If .PageFields.Count = 1 Then 这个IF条件是给单筛选字段弄的。对于多筛选字段,只要else下面那句call。 ' .Parent.PrintOut ' .Parent.PrintPreview ' Else Call PrintPvtTbl(objPvtTbl, 2) '此处断点会帮助理解。 ' End If Next For i = 1 To UBound(astrCurrentPageFld) .PageFields(i).CurrentPage = astrCurrentPageFld(i) Next End With MsgBox m End Sub Sub PrintPvtTbl(ByVal objPvtTbl As PivotTable, ByVal iPageFldIndex As Integer) Dim objPvtTblIm As PivotItem With objPvtTbl If iPageFldIndex = .PageFields.Count Then For Each objPvtTblIm In .PageFields(iPageFldIndex).PivotItems .PageFields(iPageFldIndex).CurrentPage = objPvtTblIm.Name '设个断点然后watch objPvtTblIm.Name ' .Parent.PrintOut .Parent.PrintPreview Next Exit Sub Else For Each objPvtTblIm In .PageFields(iPageFldIndex).PivotItems .PageFields(iPageFldIndex).CurrentPage = objPvtTblIm.Name Call PrintPvtTbl(objPvtTbl, iPageFldIndex + 1) '设个断点然后watch iPageFldIndex Next End If End With End Sub
打印效果:
理解起来无非是,递归不停压东西入栈(去到
If iPageFldIndex = .PageFields.Count Then)然后打印一层颜色都变,版本号和规格型号都不变的sheets。然后
.PageFields(iPageFldIndex).CurrentPage = objPvtTblIm.Name去到了版本号的下个选项。最外层的规格型号也是这道理。
相关文章推荐
- mysql筛选GROUP BY多个字段组合时的用法分享
- Eclipse用法和技巧二十:一个快速打印技巧
- [MySQL FAQ]系列 -- 快速对调字段里面的某些列
- 快速理解 乐观锁 和 悲观锁 的用法和区别
- 【Excle数据透视表】如何水平并排显示报表筛选区域的字段
- [MySQL FAQ]系列 -- 快速对调字段里面的某些列
- 快速理解JavaScript中apply()和call()的用法和用途
- 快速理解JavaScript中this的用法与陷阱
- android 里面 如何使用gson 快速获取类的所有字段名称,包括父类的
- 批量修改数据库中某个字段里面的部分内容(mysql数据库replace的用法)
- 【理解】一个利用递归打印对象路径下所有文件的小程序
- 快速理解掌握gulp用法
- 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。
- Eclipse用法和技巧二十:一个快速打印技巧
- NSArray数组 里面含有 NSMutableDictionary 字典 ,对NSMutableDictionary某个字段进行筛选过滤
- Eclipse用法和技巧二十:一个快速打印技巧
- 理解递归、递归打印文件名
- 理解Android多线程里面三种任务Runnable和Callable和FutureTask的用法
- 快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
- 黑马程序员——快速理解Java中的递归