【问题标题】:ExportAsFixedFormat fails sometimesExportAsFixedFormat 有时会失败
【发布时间】:2016-06-21 19:53:41
【问题描述】:

我有一个电子表格,其中包含直到最近才有效的表单和宏。我第一次看到所描述的行为是我第一次尝试在 Excel 2016 (Windows 10) 中使用此特定功能,但我不确定这是不是原因。

我遇到的问题是以下行

Worksheets("Label Template - 100X150").ExportAsFixedFormat Type:=xlTypePDF, _
  Filename:=pdfFilePath, Quality:=xlQualityMinimum, _
  IncludeDocProperties:=False, _
  IgnorePrintAreas:=False, OpenAfterPublish:=True

来自以下宏:

Sub PDFLabelsSheet()
'On Error GoTo errHandler  

'enter name and select folder for file
strFile = "Labels_PrintGroup-" & lstPrintGroup.Value _
            & "_" _
            & Format(Now(), "yyyy-mm-dd\_hhmm") _
            & ".pdf"
strFile = ThisWorkbook.Path & "\" & strFile

Worksheets("Label Template - 100X150").Visible = True
UnprotectTab "Label Template - 100X150"

pdfFilePath = Application.GetSaveAsFilename(InitialFileName:=strFile, _
  FileFilter:="PDF Files (*.pdf), *.pdf", _
  Title:="Select Folder and FileName to save")

If pdfFilePath <> "False" Then

    Worksheets("Label Template - 100X150").Select
    Worksheets("Label Template - 100X150").Range("A1").Select
    Worksheets("Label Template - 100X150").Range("A1").Activate
    Cells.Activate

    Worksheets("Label Template - 100X150").PageSetup.FirstPageNumber = 1

    Worksheets("Label Template - 100X150").ExportAsFixedFormat Type:=xlTypePDF, _
      Filename:=pdfFilePath, Quality:=xlQualityMinimum, _
      IncludeDocProperties:=False, _
      IgnorePrintAreas:=False, OpenAfterPublish:=True

End If

exitHandler:
    ExecutionEnd
    Exit Sub
errHandler:
    MsgBox "Something went wrong, a PDF could not be created", vbCritical
    Resume exitHandler

End Sub

我尝试了 ExportAsFixedFormat 函数的排列,将其更改为 Worksheets("name")、(number)、ActiveSheet....等。

在执行此特定 Sub 之前,工作表是未隐藏且未受保护的。我尝试将整个范围设置为 PrintArea,我也尝试选择并激活要导出的范围。

最令人沮丧的部分是它有时会起作用。我已经尽可能地放入代码来吐出 PageSetup 集合的每个属性,以确保某些东西不会炸毁东西,因为输出如此严格地依赖于页面设置。

当我手动导航到此工作表并从文件菜单中选择导出功能时,我得到了同样的错误。如果我在该工作表中单击一下,导出功能以及宏工作。

PDFLabelSheets Sub 确实从另一个 Sub 调用(由按下表单的按钮调用),它将大量数据编译到此选项卡中,尽管我已将其排除为罪魁祸首,因为仅 PDF 代码的连续运行将成功然后在不运行其他代码的情况下失败。

【问题讨论】:

  • 为什么你认为ExportAsFixedFormat 行导致了错误??
  • 单步执行代码,这就是挂断的那一行。我已将 Subs 减少为仅包含该行,但它失败了
  • 虚幻。我刚刚在 Excel 中将视图从页面布局/打印更改为正常,我再也无法让它失败。我已经进行了全方位的测试。为什么,微软,为什么?

标签: excel vba


【解决方案1】:

我找到了适合我的情况的解决方案。一个真正的头痛。也许它可以帮助其他人:

当您导出为 PDF 时,请尝试取消选中“选项”对话框下的“PDF/A 兼容”选项。之后,再次运行 VBA 代码。

对我来说,这是解决方案。

PDF Options

【讨论】:

  • 谢谢 - 这也是我的问题。我使用UseISO19005_1 方法为Microsoft.Office.Interop.Word._Document.ExportAsFixedFormat 方法激活了PDF/A。将此选项设置为 false 时,导出功能适用于 Word 16.0.13328.20350 和 Microsoft.Office.Interop.Word 版本 15.0.4797.1003。
  • 还有一件事:可以通过转到控制面板 → 颜色管理 → 高级并将“设备配置文件”设置为“系统默认值 (..)”来解决此问题。这为我做到了。 Reference
【解决方案2】:

Frogrammer-Analyst 的分析很棒,但错误并没有那么模棱两可。如果您使用运行无人参与脚本的用户登录服务器,则不会出现此问题。但是,如果您退出并尝试在无人看管的情况下重新运行脚本,您将看到没有打印机被映射并且 {ExportAsFixedFormat} 对于 PDF 和/或 XPS 格式失败。

【讨论】:

    【解决方案3】:

    我最近通过以下方式解决了一个类似的问题:

    • 涉及ExportAsFixedFormat, Type:=xlTypePDF的失败 声明
    • 语句失败,没有错误消息;它只是 停止执行 VBA 代码
    • 失败不一致, 并且失败或成功的条件并不明显

    以下是我如何解决它的摘要;也许这会建议您可以使用一些有用的方法。

    我的 Excel VBA 代码在 Windows 7 下作为无人值守的日终计划任务在后台运行,通常是在没有人登录的情况下运行。大多数情况下,代码可以工作,但有时却不行。崩溃后我无法捕获屏幕,捕获各种窗口内容也无济于事:没有有用的诊断文本。我终于尝试将程序执行里程碑记录到磁盘文件,重新打开和关闭每个里程碑的文件,因此如果程序随后崩溃,不会丢失任何文本。这将问题与ExportAsFixedFormat 语句隔离开来,但没有诊断出问题。

    我终于尝试让 VBA 代码在故障点之前保存工作簿的副本。我希望,在重新打开副本时,我能够看到哪里出了问题。那没有帮助。但是,在比较成功和不成功执行时保存的 .xlsm 文件时,我确实注意到了一些奇怪的东西——前者只是稍大一些。

    深入研究 .xlsm 文件(实际上是 .zip 文件),我注意到在成功运行后,xl\printerSettings 子文件夹中的printerSettings1.bin 文件更大。使用 SysInternals Strings 实用程序检查 .bin 文件,我发现在不成功的运行中,该文件仅包含我开发应用程序的家用计算机上的默认打印机的名称,而不是它所在的办公室计算机正在执行。在成功运行时,.bin 文件还包含办公室中默认打印机的名称。

    这是关键的区别。在那个办公室,主计算机在工作日结束后不久执行 Excel 程序。通常,这台计算机在白天打印到连接到网络上另一台计算机的激光打印机(设置为默认打印机),而另一台计算机在工作日结束时关闭。因此,根据时间上的意外,有时一天结束的 Excel 程序会看到一个有效的、可用的默认打印机,有时却没有。

    某些 Excel 命令,包括保存为 .pdf 的命令,只有在活动打印机有效时才能正常工作。 can't set PageSetup.Orientation = xlLandscape from MS Project 也有类似的观察,涉及到 .PageSetup 的字段的分配。就我而言,无法正常工作意味着在不生成任何错误消息的情况下崩溃。

    后来我发现我的问题不仅仅是网络上默认的激光打印机不可用;它也是由打印机定义的不规则引起的。我添加了代码来记录 VBA 属性Application.ActivePrinter;就在崩溃之前,它返回值“未知打印机(检查您的控制面板)”,而不是包含打印机的名称。当我重新安装默认打印机时,Application.ActivePrinter 总是返回正确的打印机名称,无论该打印机是否可用,并且程序停止崩溃。

    我的问题是一个真正的 Heisenbug - 每当我随机重新运行 Excel 工作簿时它就会消失。最终结果证明这有助于我确认它的诊断。运行无人看管,有时没有有效的打印机。当我登录我的帐户并运行它时,要么是在工作日,要么是 LogMeIn 临时将我的家用打印机分配为有效的默认打印机。这最终解释了这样一个事实,即程序只有在执行时没有被密切观察时才会失败。

    总之,我认为不一致的打印机可用性和不规则的打印机安装可能是导致无法使用 Excel VBA 持续导出 .pdf 文件的潜在原因。

    【讨论】:

    • 非常好的分析。想补充一点,我通过(临时)将活动打印机从网络上的共享打印机更改为本地打印机解决了我的问题。
    猜你喜欢
    • 2011-05-23
    • 2014-05-01
    • 2017-05-29
    • 1970-01-01
    • 2016-04-17
    • 2011-08-10
    • 2010-12-06
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多