是否有宏可按报表筛选器打印数据透视表并合并为单个PDF文件
VBA宏调整方案:多筛选条件透视表合并导出为单个PDF
直接替换原有代码即可实现所有有效筛选结果合并为同一个PDF文件:
Sub PrintAll() ' ' PrintAll Macro ' 所有员工透视表合并导出为单个PDF ' Dim Response As VbMsgBoxResult Response = MsgBox("是否导出所有员工的透视表汇总?", vbYesNo) If Response = vbNo Then Exit Sub Application.ScreenUpdating = False Application.DisplayAlerts = False On Error GoTo ErrHandler ' 刷新透视表缓存 ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh Dim pf As PivotField Dim pi As PivotItem Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("name") ' 创建临时工作表存放所有汇总内容 Dim tempSheet As Worksheet Set tempSheet = ThisWorkbook.Worksheets.Add Dim lastRow As Long lastRow = 1 Dim pivotRange As Range For Each pi In pf.PivotItems ActiveSheet.PivotTables("PivotTable1").PivotFields("name").CurrentPage = pi.Name ' 过滤无数据的空筛选结果 If ActiveSheet.PivotTables("PivotTable1").PivotFields("name").CurrentPage.Caption = pi.Caption Then Set pivotRange = ActiveSheet.PivotTables("PivotTable1").TableRange2 ' 复制当前透视表到临时表 pivotRange.Copy tempSheet.Cells(lastRow, 1).PasteSpecial Paste:=xlPasteAllUsingSourceTheme ' 每份透视表之间插入分页符 tempSheet.HPageBreaks.Add Before:=tempSheet.Cells(lastRow + pivotRange.Rows.Count + 1, 1) ' 更新下一次粘贴的起始行位置 lastRow = lastRow + pivotRange.Rows.Count + 1 End If Next ' 删除最后多余的分页符 If tempSheet.HPageBreaks.Count > 0 Then tempSheet.HPageBreaks(tempSheet.HPageBreaks.Count).Delete ' 导出合并后的PDF,可自行修改路径和文件名 tempSheet.ExportAsFixedFormat _ Type:=xlTypePDF, _ Filename:=ThisWorkbook.Path & "\员工透视表汇总.pdf", _ Quality:=xlQualityStandard MsgBox "PDF汇总导出完成,文件保存在:" & ThisWorkbook.Path & "\员工透视表汇总.pdf" Cleanup: ' 清理临时工作表和恢复设置 If Not tempSheet Is Nothing Then tempSheet.Delete Application.ScreenUpdating = True Application.DisplayAlerts = True Exit Sub ErrHandler: MsgBox "运行出错:" & Err.Description GoTo Cleanup End Sub
核心调整说明
- 取消原有循环外单次打印/循环内多次打印的逻辑,新增临时工作表存放所有非空筛选后的透视表内容
- 每份透视表粘贴后自动插入分页符,保证导出后每份内容独占一页
- 所有内容收集完成后统一执行导出操作,最终生成单个PDF文件
- 新增错误处理和状态恢复逻辑,避免运行出错后Excel设置异常
自定义修改提示
- 如需直接打印而不是导出PDF,将
tempSheet.ExportAsFixedFormat开头的导出代码块替换为tempSheet.PrintOut即可 - 如需修改PDF保存路径和文件名,直接修改
Filename参数的取值即可 - 如需调整透视表复制的范围,可将
TableRange2替换为TableRange1(仅导出数据区域不含筛选器)
内容的提问来源于stack exchange,提问作者David Hoeksema
相关产品推荐
相关产品推荐

