VBA 页面设置语句仅在调试模式下执行

VBA statements for pagesetup only executed in debug mode

以下子程序应该为 PDF 输出准备页面设置。 例如,如果由于连接的其他打印机导致分页器出现问题,子程序应将其修复为 1 页宽和 3 页高。

Sub adjustPB(ws As Variant, ps As XlPaperSize)
'On Error Resume Next
Application.DisplayAlerts = False
Application.PrintCommunication = False
With ws.PageSetup
    .LeftMargin = Application.InchesToPoints(0)
    .RightMargin = Application.InchesToPoints(0)
    .TopMargin = Application.InchesToPoints(0)
    .BottomMargin = Application.InchesToPoints(0)
    .HeaderMargin = Application.InchesToPoints(0)
    .FooterMargin = Application.InchesToPoints(0)
    .Orientation = xlLandscape
    '.Orientation = xlPortrait
    .PaperSize = ps
    .Zoom = 100
    .Zoom = False
    Debug.Print .Zoom
    .FitToPagesWide = 1
    Debug.Print .Zoom
    Debug.Print .FitToPagesWide
    .FitToPagesTall = 3
End With
Application.DisplayAlerts = True
Application.PrintCommunication = True
End Sub

当我在 'With ws.PateSetup' 处添加断点时,sub 实际上在单步 (F8) 中按预期工作。 但是,如果我 运行 它使用 F5,它会忽略这些语句。 调试打印显示,属性值没有改变。

到目前为止尝试过的事情: 使用 DoEvents 在 .zoom 和 .FitPagesWide 之前添加最多 1 秒的延迟。没变化。例如 Zoom 仍然是 55。 在单步中,Zoom 最后读取 FALSE。 任何解释/提示这里出了什么问题?

.PrintCommunication 可能是关键。此时的文档相当晦涩,但看起来 Excel 在 .PrintCommunication 关闭时缓存所有命令,并在您打开 .PrintCommunication 时将它们转储到页面设置引擎。这可能是 运行 F5 时看不到任何变化的原因。 (调试器的服务对我来说更加晦涩。)

尝试应用

With ActiveSheet.PageSetup
     ' .... 
    .Parent.Application.PrintCommunication = True
    .Zoom = 100
    .Zoom = False
    Debug.Print .Zoom
    .FitToPagesWide = 1
    Debug.Print .Zoom
    Debug.Print .FitToPagesWide
   .FitToPagesTall = 3
   .Parent.Application.PrintCommunication = False
   ' .... 
End With
Application.PrintCommunication = True

我也很想知道结果:)