+ Reply to Thread
Results 1 to 4 of 4
  1. #1
    Registered User
    Join Date
    04-09-2008
    Location
    Detroit, MI
    MS-Off Ver
    2007
    Posts
    23

    Create a PDF from Worksheet

    I'm using Excel 2003 and Adobe Acrobat 6.0.

    I have a worksheet that I would like print, and save, to PDF via VBA.

    I know it's possible, but I haven't been able to figure it out. I've searched this forum with no success. You have always been so helpful to me in the past, any help would be greatly appreciated.

  2. #2
    Forum Guru
    Join Date
    12-29-2004
    Location
    Michigan, USA
    MS-Off Ver
    2003
    Posts
    2,173
    I saved this a long time ago, but never used it. It is for PDF995, but it may help. Have a read and see if it helps.

    Did you try recording a macro?

    Jason

    I've searched the message board and found several questions, but not a good example of how to print automatically from Excel to a PDF file. After a couple of days of searching and tweaking, I've got what I think is a fairly good solution for automating your printing of worksheets to PDF files.

    This solution requires the use of PDF995. This is a free utility available at www.PDF995.com. This is a print driver that allows you to print to a PDF file. The file is compatible with Adobe and can be read with the Adobe reader like any other PDF. The free version does pop-up some advertising with each print, but the automation works with around the pop-ups. I believe the full license version is about $10 and doesn't produce the pop-ups.

    The challenge in automating a PDF process is that the PDF driver will prompt the user for a filename. This is ok if you are printing just one sheet, but if you need to automate the production of several PDFs, you need to be able to specify the name of the file in the code. The subroutine SheetToPDF presented below allows you to specify a single worksheet and the full filename for the PDF. I've included all the code and external declarations needed. The two subs at the bottom give examples of how to call SheetToPDF with the passed parameters.

    I hope you find this helpful.
    Regards,
    Steve

    Code:
    ----------------------------------------------------- 
    'Needed to Read INI file settings 
    Declare Function GetPrivateProfileString Lib "kernel32" Alias _ 
    "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As Any, ByVal lpDefault As String, _ 
    ByVal lpReturnedString As String, ByVal nSize As Long, _ 
    ByVal lpFileName As String) As Long 
    
    'Needed to Write INI file settings 
    Declare Function WritePrivateProfileString Lib "kernel32" Alias _ 
    "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As Any, ByVal lpString As Any, _ 
    ByVal lpFileName As String) As Long 
    
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
    
    
    Sub SheetToPDF(WS As Worksheet, OutputFile As String) 
    
    ' This subroutine will print a worksheet to a PDF file using PDF995, a free utility 
    ' to generate PDF files. Download it at www.pdf995.com 
    
    ' Two arguments must be passed into this routine 
    ' 1. WS - A worksheet pointer 
    ' 2. OutputFile - The full path and name of the desired pdf file 
    
    ' Be sure to check that the "Generating PDF CS" setting in pdfsync.ini is set to 0 
    ' when pdf995 is idle. This codes uses that as a completion flag as it seems to be 
    ' the most reliable indication that PDF995 is done writing the pdf file. 
    
    Dim syncfile As String, maxwaittime As Long 
    Dim iniFileName As String 'tmpPrinter As Printer 
    Dim x As Long 
    Dim tmpoutputfile As String, tmpAutoLaunch As String 
    
    ' set the location of the PDF995.ini and the pdfsync files 
    iniFileName = "c:\pdf995\res\pdf995.ini" 
    syncfile = "c:\pdf995\res\pdfsync.ini" 
    
    ' save current settings from the PDF995.ini file 
    tmpoutputfile = ReadINIfile("PARAMETERS", "Output File", iniFileName) 
    tmpAutoLaunch = ReadINIfile("PARAMETERS", "Autolaunch", iniFileName) 
    
    ' remove previous pdf if it exists 
    On Error Resume Next 
    Kill OutputFile 
    On Error GoTo Cleanup 
    
    ' setup new values in PDF995.ini 
    x = WritePrivateProfileString("PARAMETERS", "Output File", OutputFile, iniFileName) 
    x = WritePrivateProfileString("PARAMETERS", "AutoLaunch", "0", iniFileName) 
    
    'print the worksheet 
    WS.Select 
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:="PDF995" 
    
    ' PDF995 operates asynchronously. We need to determine when it is done so we can 
    ' continue. This is done by checking the "Generating PDF CS" parameter in the pdfsync.ini 
    ' file. A loop with a 2 second delay is used to determine when it is finished. 
    
    Sleep (2000) ' pause 2 seconds (1000 = 1 sec) 
    maxwaittime = 60000 'If pdf995 isn't done in 60 seconds, quit anyway 
    Do While ReadINIfile("PARAMETERS", "Generating PDF CS", syncfile) = "1" And maxwaittime > 0 
    Sleep (2000) ' pause 2 seconds and re-check the status 
    maxwaittime = maxwaittime - 2000 
    Loop 
    
    ' restore the original default printer and the PDF995.ini settings 
    Cleanup: 
    x = WritePrivateProfileString("PARAMETERS", "Output File", tmpoutputfile, iniFileName) 
    x = WritePrivateProfileString("PARAMETERS", "AutoLaunch", tmpAutoLaunch, iniFileName) 
    x = WritePrivateProfileString("PARAMETERS", "Launch", "", iniFileName) 
    On Error Resume Next 
    
    
    End Sub 
    
    Function ReadINIfile(sSection As String, sEntry As String, sFilename As String) As String 
    Dim x As Long 
    Dim sDefault As String 
    Dim sRetBuf As String, iLenBuf As Integer 
    Dim sValue As String 
    
    'Six arguments 
    'Explanation of arguments: 
    'sSection: ini file section (always between brackets) 
    'sEntry : word on left side of "=" sign 
    'sDefault$: value returned if function is unsuccessful 
    'sRetBuf$ : the value you're looking for will be copied to this buffer string 
    'iLenBuf% : Length in characters of the buffer string 
    'sFileName: Path to the ini file 
    
    sDefault$ = "" 
    sRetBuf$ = String$(256, 0) '256 null characters 
    iLenBuf% = Len(sRetBuf$) 
    x = GetPrivateProfileString(sSection, sEntry, _ 
    sDefault$, sRetBuf$, iLenBuf%, sFilename) 
    ReadINIfile = Left$(sRetBuf$, x) 
    
    End Function 
    
    
    Sub PrintToPDF() 
    ' This example prints the first sheet of the workbook. It calls the SheetToPDF subroutine, 
    ' passing it the worksheet pointer, and the PDFFileName (the worksheet name + .pdf) 
    
    Dim PDFFileName As String 
    PDFFileName = "c:\temp\" & Sheets(1).Name & ".pdf" 
    Call SheetToPDF(Sheets(1), PDFFileName) 
    End Sub 
    
    
    Sub PrintCPSheets() 
    ' This example prints specific named worksheets. It calls the SheetToPDF subroutine one 
    ' time for each sheet, passing it a worksheet pointer, and PDFFileName. 
    
    Dim CS As Worksheet 
    Dim PDFFileName As String 
    
    CurrentPath = "c:\temp\" 
    
    Set CS = Sheets("West") 
    PDFFileName = CurrentPath & CS.Name & ".pdf" 
    Call SheetToPDF(CS, PDFFileName) 
    
    Set CS = Sheets("Northeast") 
    PDFFileName = CurrentPath & CS.Name & ".pdf" 
    Call SheetToPDF(CS, PDFFileName) 
    
    Set CS = Sheets("Northeast") 
    PDFFileName = CurrentPath & CS.Name & ".pdf" 
    Call SheetToPDF(CS, PDFFileName) 
    
    Set CS = Sheets("Southeast") 
    PDFFileName = CurrentPath & CS.Name & ".pdf" 
    Call SheetToPDF(CS, PDFFileName) 
    
    Set CS = Sheets("Central") 
    PDFFileName = CurrentPath & CS.Name & ".pdf" 
    Call SheetToPDF(CS, PDFFileName) 
    
    End Sub

  3. #3
    Forum Contributor
    Join Date
    08-02-2007
    Location
    Panama & Austria
    MS-Off Ver
    XP 2003
    Posts
    182
    This might help:

    Code:
    ThisWorkbook.PrintOut Copies:=1, ActivePrinter:= _
            "CutePDF Writer auf CPW2:", Collate:=True
    Just replace "CutePDF Writer auf CPW2:" with the name you have for Adobe Acrobat.
    if you are not sure the correct name, just start the macro recorder and then go: File -> Print...
    In there select the Pdf program you use and click print.
    After the .pdf is generate, just check the right name in the Visual Basic Editor.

    Hope it helps.

  4. #4
    Registered User
    Join Date
    04-09-2008
    Location
    Detroit, MI
    MS-Off Ver
    2007
    Posts
    23
    Quote Originally Posted by jasoncw View Post
    I saved this a long time ago, but never used it. It is for PDF995, but it may help. Have a read and see if it helps.

    Did you try recording a macro?

    Jason
    That worked great! Thank you.

    For some reason though, when I tried it on another machine, it prints straight to the default printer instead of selecting PDF Maker, even after I granted access in the reference library.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Search Engine Friendly URLs by vBSEO 3.2.0