ExportAsFixedFormat有时失败

我有一个表格和macros,直到最近工作的电子表格。 我第一次看到描述的行为是我第一次尝试在Excel 2016(Windows 10)中使用这个特殊的function,但我不确定这是什么原因。

我遇到的问题是以下行

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

来自以下macros:

 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,我尝试select并激活要导出的范围。

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

当我手动导航到此工作表并从文件菜单中select导出function时,出现相同的错误。 如果我在该工作表中点击导出function以及macros工作。

PDFLabelSheets Sub从另一个Sub调用(由一个窗体的button按下来调用),它将一堆数据编译到这个选项卡中,尽pipe我已经排除了这个罪魁祸首,因为连续运行PDF代码将成功,然后失败运行其他代码。

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

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

以下是我如何解决这个问题的总结。 也许这会build议你可以使用一些有用的方法。

我的Excel VBA代码在Windows 7下以无人值守的方式在后台运行,通常在没有人login的情况下运行。绝大多数情况下代码可以工作,但有时候不会。 在崩溃后,我无法捕获屏幕,捕获各种窗口内容并没有帮助:没有有用的诊断文本。 我终于尝试将程序执行里程碑logging到一个磁盘文件,重新打开和closures每个里程碑的文件,所以如果程序随后崩溃,文本将不会丢失。 这将问题隔离到ExportAsFixedFormat语句,但没有诊断问题。

我终于尝试让VBA代码在故障点之前保存工作簿的副本。 我希望在重新开放这个副本的时候,我可以看到出了什么问题。 这没有帮助。 但是,在比较保存在成功执行和不成功执行上的.xlsm文件时,我注意到了一些奇怪的事情 – 前者只是稍大一点。

挖掘到.xlsm文件(真的是.zip文件),我注意到,在xl\printerSettings子文件夹中,成功运行后, printerSettings1.bin文件变大了。 使用SysInternalsstring实用程序来检查.bin文件,我发现,在不成功的运行中,这个文件只包含家庭计算机上我开发应用程序的默认打印机的名称,而不是办公室的计算机正在执行。 在成功运行时,.bin文件还包含办公室中默认打印机的名称。

这是关键的区别。 在那个办公室里,主计算机在工作日结束后不久执行Excel程序。 通常,这台计算机在白天打印到连接到networking上另一台计算机的激光打印机(设为默认打印机),并在工作日结束时closures另一台计算机。 因此,根据计时事故,有时Excel日程结束时会看到一个有效的,可用的默认打印机,有时不会。

某些Excel命令(包括保存为.pdf的命令)只有在活动打印机有效时才能正常工作。 有一个类似的观察无法设置PageSetup.Orientation = xlLandscape从MS Project ,关于分配到.PageSetup领域。 在我的情况下,未能正常工作意味着崩溃而不会产生任何错误消息。

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

我的问题是一个真正的Heisenbug – 随时随地重新运行Excel工作簿,它消失了。 这最终certificate能帮助我确认它的诊断。 无人值守运行,有时没有有效的打印机。 当我login到我的账户并运行它时,无论是在工作日,还是LogMeIn暂时将我的家用打印机分配为有效的默认打印机。 这最终意识到,这个程序只有在执行时没有被严密遵守的情况下才会失败。

总之,我会考虑打印机可用性不稳定和打印机安装不正常的问题,因为可能导致无法使用Excel VBA一致地导出.pdf文件的潜在原因。