Ton*_*ker 6 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
Run Code Online (Sandbox Code Playgroud)
哪个来自以下宏:
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
Run Code Online (Sandbox Code Playgroud)
我尝试了ExportAsFixedFormat函数的排列,将其更改为Worksheets("name"),(number),ActiveSheet ....等.
在执行此特定Sub之前,工作表将被取消隐藏且不受保护.我已经尝试将整个范围设置为PrintArea,我也尝试选择并激活要导出的范围.
最令人沮丧的是它有时会起作用.我已经尽可能地放入代码来吐出PageSetup集合的每个属性,以确保某些东西不会被搞砸,因为输出严格依赖于页面设置.
当我手动导航到此工作表并从文件菜单中选择导出功能时,我得到相同的错误.如果我在该工作表中点击导出功能以及宏工作.
PDFLabelSheets Sub确实从另一个Sub调用(由表单按下按钮调用),它将一大堆数据编译到此选项卡中,尽管我已经将其排除为罪魁祸首,因为仅仅PDF代码的连续运行将成功然后失败而没有运行其他代码.
小智 7
我最近通过以下方式解决了一个类似的问题:
ExportAsFixedFormat, Type:=xlTypePDF
声明的失败以下是我如何解决它的摘要;也许这会建议您可以使用一些有用的方法。
我的 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 文件的潜在原因。