ExportAsFixedFormat有时失败

时间:2016-03-08 02:18:10

标签: excel vba excel-vba

我有一个表单和宏的电子表格,直到最近才有效。我第一次看到所描述的行为是我第一次尝试在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函数的排列,将其更改为工作表(&#34;名称&#34;),(数字),ActiveSheet ....等等。

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

最令人沮丧的是它有时会起作用。我已经把代码扩展到PageSetup集合的每个属性,以确保某些东西不会被搞砸,因为输出严格依赖于页面设置。

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

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

3 个答案:

答案 0 :(得分:4)

我最近在以下方面解决了类似的问题:

  • 它涉及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文件的根本原因。

答案 1 :(得分:1)

Frogrammer-Analyst的分析很棒,但错误不是那么模糊。如果使用运行无人参与脚本的用户登录服务器,则不会出现此问题。但是,如果您注销然后尝试重新运行无人参与的脚本,您将看到没有映射打印机,并且{ExportAsFixedFormat}无法用于PDF和/或XPS格式。

答案 2 :(得分:1)

我为我的案件找到了解决方案。真是头疼。也许可以帮助其他人:

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

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

PDF Options