VBA打印数据透视表宏F8调试正常 直接运行时PrintArea设置失效
根因定位
ThisWorkbook.RefreshAll是异步执行的,直接运行时不会等待刷新完成就会执行后续代码,逐行调试时因为操作间隔足够,透视表已经完成刷新,所以计算的最后行/列是正确的;直接运行时透视表还在刷新,过滤后的数据还没渲染完成,取到的最后行自然不对。- 计算
lastRowSAS的简写表达式[LOOKUP(2,1/(A1:A65536<>""),ROW(A1:A65536))]默认绑定的是当前活动工作表,如果调用宏时活动表不是loyer_pivot,取到的行号完全错误,这是仅打印第一行的核心诱因。 UsedRange本身会包含有格式设置但无内容的单元格区域,这就是另一个脚本识别行号偏大、打印空白页的原因。- 异常分支未恢复自动计算模式,若触发
notfound逻辑会导致Excel一直停留在手动计算模式,进一步加重数据更新不及时的问题。
修正后代码
Sub PrintLoyerPivot(ByVal codeConv As String) Dim filter As PivotItem Dim ws As Worksheet Dim lastRowSAS As Long Dim lastColSAS As Long Dim ColumnLetter As String Dim pt As PivotTable ' 提前绑定对象避免重复调用 Set ws = ThisWorkbook.Sheets("loyer_pivot") Set pt = ws.PivotTables("LoyerParCode") ' 禁用后台刷新,保证刷新同步完成 pt.PivotCache.BackgroundQuery = False Application.Calculation = xlCalculationAutomatic ThisWorkbook.RefreshAll DoEvents ' 等待所有刷新任务执行完毕 Application.Calculation = xlCalculationManual pt.PivotFields("CodeConv").ClearAllFilters For Each filter In pt.PivotFields("CodeConv").PivotItems If filter.Caption = codeConv And filter.RecordCount > 0 Then GoTo SetFilter1 Next filter GoTo notfound SetFilter1: pt.PivotFields("CodeConv").CurrentPage = codeConv DoEvents ' 等待透视表过滤后完成重算渲染 ' 所有范围显式绑定ws对象,避免隐式引用活动表出错 lastRowSAS = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row lastColSAS = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ColumnLetter = Split(ws.Cells(1, lastColSAS).Address, "$")(1) ws.Calculate ws.Range("A1:" & ColumnLetter & lastRowSAS).Columns.AutoFit With ws.PageSetup .PrintArea = ws.Range("A1:" & ColumnLetter & lastRowSAS).Address .PrintQuality = 600 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FitToPagesWide = 1 .FitToPagesTall = False ' 显式不限制打印高度,避免内容被强制压缩 .ScaleWithDocHeaderFooter = True .AlignMarginsHeaderFooter = True End With ws.PrintOut Application.Calculation = xlCalculationAutomatic notfound: ' 异常分支也要恢复计算模式,避免影响其他功能 Application.Calculation = xlCalculationAutomatic End Sub
额外优化建议
如果仍出现空白页问题,可以在设置打印区域前加一行ws.UsedRange.ClearFormats清除残留无效格式;也可以直接用透视表自带的范围属性取数,比自行计算行列更可靠:直接使用pt.TableRange2即可获取透视表包含筛选器在内的完整有效范围,无需单独计算最后行、列。
内容的提问来源于stack exchange,提问作者Änder van Kaufenbergh
相关产品推荐
相关产品推荐

