Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ExportAsFixedFormat fails sometimes

Tags:

excel

vba

I have a spreadsheet with forms and macros that worked until recently. The first time I saw the described behavior was the first time I tried using this particular function in Excel 2016 (Windows 10), though I'm not sure that's the cause.

The issue I'm having is with the following line

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

Which comes from the following macro:

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

I've tried permutations of the ExportAsFixedFormat function, changing it to Worksheets("name"), (number), ActiveSheet.... etc.

Prior to executing this particular Sub, the worksheet is unhidden and unprotected. I've tried setting the entire range as PrintArea, I've tried selecting and activating the range to be exported as well.

The most frustrating part is it works sometimes. I've gone as far as putting in code that spits out every property of the PageSetup collection to make sure that something is not blowing things up since the output depends so strictly on the page setup.

When I navigate to this worksheet manually and choose the export function from the file menu, I get the same error. If I click around in that worksheet for a bit the Export function as well as the Macro work.

The PDFLabelSheets Sub does get called from another Sub (invoked by a form's button press) which compiles a boatload of data into this tab, though I've ruled it out as the culprit as successive runs of just the PDF code will succeed then fail without running the other code.

like image 429
Tony Baker Avatar asked Mar 08 '16 02:03

Tony Baker


1 Answers

I’ve recently solved a problem that was similar in the following ways:

  • It involved the failure of the ExportAsFixedFormat, Type:=xlTypePDF statement
  • The statement failed with no error message; it simply stopped the execution of the VBA code
  • The failure was inconsistent, and the conditions for failure or success were not obvious

Below is a summary of how I solved it; perhaps this will suggest some useful approaches you can use.

My Excel VBA code was running under Windows 7 as an unattended, end-of-day scheduled task in the background, usually when no one was logged in. Most of the time the code would work, but sometimes it would not. I could not capture the screen after a crash, and capturing the various window contents did not help: there was no useful diagnostic text. I finally tried logging program execution milestones to a disk file, reopening and closing the file for each milestone, so no text would be lost if the program subsequently crashed. That isolated the problem to the ExportAsFixedFormat statement but did not diagnose the problem.

I finally tried having the VBA code save a copy of the workbook just prior to the point of failure. I was hoping that, on re-opening the copy, I’d be able to see what was wrong. That did not help. However, I did notice something strange when comparing the .xlsm files saved on successful and unsuccessful executions – the former were just a little larger.

Digging into the .xlsm files (which are really .zip files), I noticed that, in the xl\printerSettings subfolder, the printerSettings1.bin file was larger after successful runs. Using the SysInternals Strings utility to inspect the .bin files, I found that, in the unsuccessful runs, this file contained only the name of the default printer on the home computer where I had developed the application, which was not the office computer where it was executing. On the successful runs, the .bin file also contained the name of the default printer in the office.

This was the critical difference. In that office, the main computer executes the Excel program shortly after the end of the working day. Ordinarily, during the day this computer prints to a laser printer (set as the default printer) attached to another computer on the network, and that other computer is turned off at the end of the working day. Therefore, depending on accidents of timing, sometimes the end-of-day Excel program would see a valid, available default printer, sometimes not.

Some Excel commands, including the command to save as a .pdf, work properly only when the active printer is valid. There is a similar observation at can't set PageSetup.Orientation = xlLandscape from MS Project, concerning assignments to the fields of .PageSetup. In my case, failing to work properly meant crashing without generating any error message.

I later discovered that my problem was not simply the unavailability of the default laser printer over the network; it was also caused by something irregular about the printer definition. I had added code to log the VBA property Application.ActivePrinter; just prior to a crash, it was returning the value “unknown printer (check your Control Panel)”, rather than containing the name of the printer. When I re-installed the default printer, Application.ActivePrinter always returned the proper printer name, whether or not that printer was available for use, and the program stopped crashing.

My problem was a true Heisenbug – it disappeared whenever I re-ran the Excel workbook at random times. That ultimately turned out to help me confirm its diagnosis. Running unattended, sometimes there was no valid printer. When I logged into my account and ran it attended, either it was during the business day or else LogMeIn temporarily assigned my home printer as a valid default printer. This finally made sense of the fact that the program failed only when it wasn’t being closely observed at the time of execution.

In summary, I’d look at inconsistent printer availability and irregular printer installation as possible underlying causes of failure to consistently export .pdf files using Excel VBA.

like image 192
Frogrammer-Analyst Avatar answered Sep 21 '22 05:09

Frogrammer-Analyst