This post describes the Test PDF app feature of the Export to PDF form from the Total Cost Model. It provides a simple way to check for valid export targets for Excel workbooks and may be adapted to work with other file types. You can download the Total Cost Model workbook and see it in action and inspect the code yourself. The workbook is free and without any password protection.
The exporting code is explained in another post, so we will just concentrate on this simple code to create and open a worksheet as an exported PDF document. The purpose of this feature is to ensure that there is the capability to export and open a PDF document on your PC.
Clicking the Test PDF app button triggers the cmdTest click event and runs the following code:
Private Sub cmdTest_Click() ' check for the availability of a PDF reader On Error Resume Next If MsgBox("This procedure will try to open a sample document in the default PDF reader on your system. Do you want to continue?", _ vbYesNo, "Test for a PDF reader...") = vbYes Then Call Check_Reader End If End Sub
This simple code is just a gateway to ask if you want to continue with the process. The command Call Check_Reader does the work. It is listed below…
Remember… all these samples scroll to the right to reveal the complete code→
The Check_Reader code is explained in the following pseudocode:
- Initiate a variable for the System sheet number, a loop counter and a worksheet object
- Change the Application properties for DisplayAlerts, EnableEvents and ScreenUpdating to False. The workbook Calculation property is set to manual and the Cursor is set to the wait style.
- Get the number of visible System worksheets using GetSystemNum(). This a custom function that returns the number of active System worksheets so the routine knows what worksheets to unhide at the end of the test.
- Create the PDF test worksheet (“Test_for_PDF”). This is done first because there must always be one open worksheet in an Excel workbook. Trying to hide all of the worksheets will throw an error!
- Next the other worksheets visibility are set to False using a simple For loop.
- Export the only visible worksheet (“Test_for_PDF”) using Excel’s ExportAsFixedFormat method.
- Return the worksheets to their correct visibility, for the systems worksheets the var from the first step (GetSystemNum()) is used.
- Delete the PDF test worksheet (“Test_for_PDF”).
- Return the Application properties for DisplayAlerts, EnableEvents and ScreenUpdating to True. Reset the Calculation property to automatic and the Cursor to the Excel default.
- The error handling routine, errHandler, will trigger if there is a legitimate error (>0), display a message and resume executing the code at the next statement after the error.
Private Sub Check_Reader() ' Check to see if a PDF reader is available...create a document and open it...at least try to... Dim sysNum, i As Integer Dim ws As Worksheet On Error GoTo errHandler With Application .DisplayAlerts = False .EnableEvents = False ' turn OFF event tracking .Calculation = xlCalculationManual ' turn OFF the auto calculations, for speed... .ScreenUpdating = False .Cursor = xlWait End With sysNum = GetSystemNum() 'get the number of active systems ' First CREATE the PDF test sheet and THEN set the other sheets visibility to false With ThisWorkbook Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count)) ws.Name = "Test_for_PDF" End With With ws With .Range("A3") .Value = "Success!" .Font.Size = 16 .Font.Color = vbRed End With With .Range("A5") .Value = "If you are reading this in a PDF reader you are set to export your documents…" .Font.Size = 12 .Font.Color = vbBlack End With With .Range("A6") .Value = "There is nothing else here, you can close this reader app and go back to work." .Font.Size = 12 .Font.Color = vbBlack End With End With For i = 1 To 7 Worksheets(i).Visible = False Next ' Second, export the visible sheet ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, fileName:= _ "Total Cost Model - exported.pdf", Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, _ OpenAfterPublish:=True ' Return the sheets to their correct visibility, for the systems use the var from the first step For i = 1 To 7 If i = 3 Or i = 4 Then Select Case sysNum Case 1 'do nothing... Case 2 Sheets(3).Visible = True Case 3 Sheets(3).Visible = True Sheets(4).Visible = True End Select Else Worksheets(i).Visible = True End If Next ' DELETE the PDF test sheet With Worksheets(Sheets.Count) If .Name = "Test_for_PDF" Then Sheets(Sheets.Count).Delete End If End With Set ws = Nothing With Application .Calculation = xlCalculationAutomatic ' turn ON the auto calculations .DisplayAlerts = True .EnableEvents = True ' turn ON event tracking .ScreenUpdating = True .Cursor = xlDefault End With errHandler: ' Error-handling routine If Err.Number >; 0 Then MsgBox ("Error: " & Err.Description & ". Error number: " & Err.Number) Resume Next End If End Sub
So simple…and maybe not necessary considering most every modern Windows PC has an application which will open and display a PDF file. This has been adapted and used for my exporting to Microsoft Word© tools in other workbooks.