Wykorzystanie PDFCreator'a w Excelu   strona główna:
A po co ten Excel ;-)
 
  inne ciekawe strony:
    Temat pewnie z biegiem czasu odejdzie w zapomnienie bo wraz z ServisPackiem 2 do E2007 zapis Arkusza/'Zgrupowanych Arkuszy'  
do formatu pdf przestał być problemem jednak posiadacze E2003 którym przyszo się mierzyć z takim zadaniem najprawdopodobniej    2007 Microsoft Office Add-in: Microsoft Save as PDF
znają PDFCreator'a.  
    Program i tyle ciekawy że można go oprogramować z poziomu VBA. Jednak procedury realizujące zadanie często sprawiały problemy.  
Nie twierdzę że poniżej prezentowana jest doskonała, ale moje wymagania (pewnie niezbyt wygórowane) spełniała. Może więc się komuś   Create and Mail PDF files with Excel 2007/2010 Ron de Bruin
przyda. :-)  
 
Sub PrintToPDF_PDFCreator(vSheetNames As Variant, _   Creating and Sending PDF Files from Excel 2007 and Excel 2010
                          strPDFFileName As String, _  
                          strPDFFilePath As String)  
    On Error GoTo PrintToPDF_PDFCreator_Error  
      
    '---------------------------------------------------  
    'Procedura wymaga zainstlowanego programu PDFCreator  
    'http://sourceforge.net/projects/pdfcreatorpl/files/  
    '---------------------------------------------------  
      
    Dim objPDFCreator As Object ' PDFCreator.clsPDFCreator  
      
    Const saveFormatPDF = 0  
 
    Set objPDFCreator = CreateObject("PDFCreator.clsPDFCreator")  
    With objPDFCreator  
        If Not .cStart("/NoProcessingAtStartup") Then Err.Raise 10001  
 
        .cOption("UseAutosave") = 1  
        .cOption("UseAutosaveDirectory") = 1  
        .cOption("AutosaveDirectory") = strPDFFilePath  
        .cOption("AutosaveFilename") = strPDFFileName  
        .cOption("AutosaveFormat") = saveFormatPDF  
        .cClearCache  
 
        Application.Sheets(vSheetNames).PrintOut copies:=1, _  
                                                 ActivePrinter:="PDFCreator"  
 
        Do Until .cCountOfPrintjobs = 1  
            DoEvents  
        Loop  
 
        .cCombineAll  
        .cPrinterStop = False  
 
        Do Until .cCountOfPrintjobs = 0  
            DoEvents  
        Loop  
          
        Shell "CMD /C taskkill /f /im PDFCreator.exe"  
        .cClose  
    End With  
    Set objPDFCreator = Nothing  
 
    'MsgBox "Przeszło :-)", vbInformation  
      
PrintToPDF_PDFCreator_Exit:  
    On Error Resume Next  
    If Not objPDFCreator Is Nothing Then  
        With objPDFCreator  
            Shell "CMD /C taskkill /f /im PDFCreator.exe"  
            .cClose  
            Set objPDFCreator = Nothing  
        End With  
    End If  
Exit Sub  
 
PrintToPDF_PDFCreator_Error:  
    Select Case Err.Number  
        Case 429: MsgBox "Nie masz zainstalowanego programu PDFCreator" & vbCrLf & vbCrLf & _  
                          "A pisałem że trzeba ;-)", _  
                          vbCritical  
        Case 10001: MsgBox "Can't initialize PDFCreator.", _  
                           vbCritical, _  
                           "VBAProject - PriToPDFPDFCre"  
        Case Else: MsgBox "Unexpected error - " & Err.Number & vbCrLf & vbCrLf & _  
                          Err.Description, _  
                          vbExclamation, _  
                          "VBAProject - PriToPDFPDFCre"  
    End Select  
    Resume PrintToPDF_PDFCreator_Exit  
 
End Sub  
 
     Tłumaczenie ograniczę jedynie do kilku istotnych kwestii.  
 - argumenty procedury:  
 
Sub PrintToPDF_PDFCreator(vSheetNames As Variant, _  
                          strPDFFileName As String, _  
                          strPDFFilePath As String)  
 
 - vSheetNames to nazwa Arkusza który chcemy zapisać jako pdf, lub tablica z nazwami Arkuszy przeznaczonymi do tego celu. Ważne  
jest że powstanie jeden plik pdf. Jeżeli chcielibyćmy żeby dla każdego Arkusza powstał oddzielny plik pdf należy wywołać procedurę w  
pętli dla każdego arkusza z osobna.  
 - strPDFFileName to nazwa pliku docelowego. Sama nazwa bez ścieżki.  
 - strPDFFilePath to właśnie ścieżka pliku docelowego.  
 
        Shell "CMD /C taskkill /f /im PDFCreator.exe"  
 
To maleństwo ma pilnować żeby procedura się za często nie wieszała. Kłopot z PDFCreatorem jest taki że nie chcę się "gad" zamykać  
po realizacji zadania. Ucięcie procesu, choć to trochu derastyczny sposób, za zwyczaj mi pomagało.  
 
Może jeszcze kilka przykładów:  
 
Sub Start()  
      
    '-------------Jeden arkusz---------------  
    'PrintToPDF_PDFCreator "Arkusz1", _  
                          "dan1.pdf", _  
                          ThisWorkbook.Path  
 
    '-------------tablica arkuszy------------  
    'PrintToPDF_PDFCreator VBA.Array("Arkusz1", "Arkusz2"), _  
                          "dan2.pdf", _  
                          ThisWorkbook.Path  
                            
    '-------------niepuste arkusze-----------  
    Dim xlWks As Excel.Worksheet  
    Dim arrWks() As Variant, i As Integer  
      
    For Each xlWks In ThisWorkbook.Worksheets  
        If Not IsEmptySheet(xlWks) Then  
            ReDim Preserve arrWks(i)  
            arrWks(i) = xlWks.Name: i = i + 1  
        End If  
    Next  
      
    If i > 0 Then  
            PrintToPDF_PDFCreator arrWks, _  
                          "dan3.pdf", _  
                          ThisWorkbook.Path  
    End If  
End Sub  
 
Function IsEmptySheet(ByVal wksSheet As Worksheet) As Boolean  
   
    'Kasowanie pustych arkuszy  
    'http://www.swiatexcela.pl/2011/11/02/kasowanie-pustych-arkuszy/  
 
    '*********************************************************************  
    ' Funkcja sprawdza czy arkusz jest pusty. Robi to na podstawie funkcji  
    ' arkuszowej ILE.NIEPUSTYCH/COUNTA.  
    '*********************************************************************  
 
    ' Jeżeli istnieje conajmniej jedna niepusta komórka w arkuszu (formuły  
    ' także są wliczane) to zwróć wartość False  
 
    IsEmptySheet = (WorksheetFunction.CountA(wksSheet.UsedRange) = 0)  
   
End Function