Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1052to1056
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einzelnes Tabellnblatt in PDF Datei speichern

Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 15:30:50
Jens
Ich habe folgendes Problem, ich möchte ein einzelnes Tabellenblatt aus Excel heraus in eine Pdf Datei mittels command Buttom und Makro/ VBA speichern. Als PDF Prog nutze ich Adobe Acrobat Prof 8.0(bringt nen Converter mit).
THX im Voraus

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 15:39:34
dieter(drummer)
Hi THX?
mit Makrorecordxer aufzeichnen. Tabellenblatt drucken und den PDF Printer wählen. Annschliessend Makro mit Button verbinden. Fertig.
Gruß
dieter(drummer)
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 16:03:40
Jens
Danke für die schnelle Antwort, aber ich habe vergessen zu erwähnen das ich die Möglichkeit haben möchte den Dateinamen und den Speicherort (kann differenzieren) zu bestimmen!
Jens
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 16:07:44
Ramses
Hallo
So einfach wie Dieter das beschreibt geht es mit dem PDF Drucker eben leider nicht :-)
... und mit Acrobat erst recht nicht :-)
Ich habe dies vor längerer Zeit mal für ein Projekt gemacht. Es funktoiniert unter Adobe 6 und 7.
Ob es mit der 8er Version funktioniert weiss ich leider nicht, aber du kannst das ja mal testen und mir dann Bescheid geben.
Lass dich nicht von der "Masse" Code täuschen, es geht vielleicht auch kürzer und vielleicht auch noch eleganter. Aber ich hatte keine Lust das Teil zu optimieren :-)
Erstelle in deiner eine Mappe ein Modul und benenne dies z.B. mit "Adobe_Print" und füge dort diesen Code komplett ein
Option Explicit
'Code zur Verwendung mit Adobe Acrobat 6./7.0

'Im VB-Editor die Verweise setzen auf die Objectlibraries:
'Microsoft Office 10.0 bzw. 11.0 Object Library
'Acrobat Distiller
'Acrobat Application

'Liest alle unter dem aktuell angemeldeten Benutzer
'installierten Drucker aus
'by Nepumuk
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" ( _
    ByVal lpAppName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Long) As Long


Private Const MAX_PRINTERS = 16
Private strPrinterNames(MAX_PRINTERS) As String
Private strPrinterDrivers(MAX_PRINTERS) As String
Private strPrinterPorts(MAX_PRINTERS) As String
Private intPrinterCount As Integer

'Adobe Print Job
'(C) by Ramses
'*********************************
'Zusätzlich wird das Klassenmodul classAcroDist benötigt !!!
'*********************************
'Mit dieser Sequenz wird der Ausdruck gestartet
Sub Start_Print()
    'Druckt die aktuelle Tabelle als PDF-Datei
    'in das aktuelle Verzeichnis wo die Mappe gespeichert ist
    Call Print_to_PDF(ActiveSheet)
End Sub
'**********************************************

Public Sub Print_to_PDF(tarWks As Worksheet)
    '(C) by Ramses
    '*********************************
    'Verweise setzen auf
    'Microsoft Office 10.0 / 11.0 Object Library und
    '"Acrobat Distiller" sowie "Acrobat" (Application)
    '*********************************
    Dim myAdobeDist As classAcroDist 'see class module
    Dim myWB As Workbook
    Dim strFileName As String
    Dim strFileToPrintPfad As String
    Dim DistInputPS As String
    Dim DistOutputPDF As String
    Dim DistJobOptions As String
    Dim oldActivePrinter As String
    Set myAdobeDist = New classAcroDist
    'Distiller ausgeblendet startetn
    myAdobeDist.myAdobeDist.bShowWindow = False
    'Alle aktuellen Printjobs des Distillers stoppen
    myAdobeDist.myAdobeDist.bSpoolJobs = False
    'Alten Drucker aufnehmen
    oldActivePrinter = Application.ActivePrinter
    'Workbook zuweisen
    Set myWB = Workbooks(tarWks.Parent.Name)
    'Pfad der Mappe extrahieren
    strFileToPrintPfad = myWB.Path
    'Dann wechsle vorher in den Pfad der Datei
    ChDrive (Left(strFileToPrintPfad, 2))
    ChDir myWB.Path
    'Zur druckender: Mappenname_Tabelle1
    strFileName = strFileToPrintPfad & "\" & Left(myWB.Name, Len(myWB.Name) - 4) & "_" & tarWks.Name
    'EXCEL kann nur PS-Files direkt drucken
    'daher muss sowohl PS-File wie auch PDF-File definiert werden
    DistInputPS = strFileName & ".ps"
    DistOutputPDF = strFileName & ".pdf"
    'Der Druckername wird automatisch ermittelt
    'in der Funktion "Get_Adobe_Printer"
    myWB.PrintOut ActivePrinter:=Get_Adobe_Printer, PrToFileName:=DistInputPS, PrintToFile:=True
    'Dem Distiller das PS-File zum konvertieren übergeben
    Call myAdobeDist.myAdobeDist.FileToPDF(DistInputPS, DistOutputPDF, DistJobOptions)
    'Schauen wie lange er braucht
    'und Status OK meldet
    Do While Not myAdobeDist.blnFinished
        DoEvents
    Loop
    If myAdobeDist.blnFinished Then
        MsgBox "PDF Printjob erfolgreich beendet"
    Else
        MsgBox "Fehler beim Druck in PDF Datei aufgetreten"
    End If
    'Alten Drucker wieder herstellen
    Application.ActivePrinter = oldActivePrinter
    'Variablen leeren
    Set myAdobeDist = Nothing
    Open_PDF DistOutputPDF
End Sub


Sub Open_PDF(fileToOpen As String)
    '(C) by Ramses
    '****************
    'Verweis auf Acrobat Application setzen !!!
    '****************
    Dim myAdobeAc As Acrobat.CAcroApp
    Dim myAdobeDoc As Acrobat.CAcroPDDoc
    Dim myAdobeView As Acrobat.CAcroAVDoc
    'Adobe Application zuweisen
    Set myAdobeAc = CreateObject("AcroExch.App")
    'Adobe Dokument Handler zuweisen
    Set myAdobeDoc = CreateObject("AcroExch.PDDoc")
    If myAdobeDoc.Open(fileToOpen) Then
        myAdobeAc.Show
        'Adobe View Handler zuweisen
        'um mit dem Dokument allenfalls arbeiten zu können
        'via VBA
        Set myAdobeView = myAdobeDoc.OpenAVDoc("")
    Else
        MsgBox "Unable to open the PDF-file", vbInformation
    End If
    Set myAdobeView = Nothing
    Set myAdobeDoc = Nothing
    Set myAdobeAc = Nothing
End Sub

Function Get_Adobe_Printer() As String
    '(C) by Ramses
    'Adobe Drucker bestimmen
    'Code zum Druckerauslesen ist Bestandteil dieses Codes
    Dim strBuffer As String
    Dim intIndex As Integer
    strBuffer = Space$(8192)
    GetProfileString "PrinterPorts", vbNullString, "", strBuffer, Len(strBuffer)
    prcGetPrinterNames strBuffer
    prcGetPrinterPorts
    For intIndex = 0 To intPrinterCount
        If InStr(1, strPrinterNames(intIndex), "Adobe") > 0 Then
            'Genaue Druckerbezeicnung übergeben
            Get_Adobe_Printer = strPrinterNames(intIndex) & " auf " & strPrinterPorts(intIndex)
            Debug.Print strPrinterNames(intIndex) & " auf " & strPrinterPorts(intIndex)
            Exit For
        End If
    Next
End Function


Private Sub prcGetPrinterNames(ByVal strBuffer As String)
    'by Nepumuk
    Dim intIndex As Integer
    Dim strName As String
    intPrinterCount = 0
    Do
        intIndex = InStr(strBuffer, Chr(0))
        If intIndex > 0 Then
            strName = Left$(strBuffer, intIndex - 1)
            If Len(Trim$(strName)) > 0 Then
                strPrinterNames(intPrinterCount) = Trim$(strName)
                intPrinterCount = intPrinterCount + 1
            End If
            strBuffer = Mid$(strBuffer, intIndex + 1)
        Else
            If Len(Trim$(strBuffer)) > 0 Then
                strPrinterNames(intPrinterCount) = Trim$(strBuffer)
                intPrinterCount = intPrinterCount + 1
            End If
            strBuffer = ""
        End If
    Loop While (intIndex > 0) And (intPrinterCount < MAX_PRINTERS)
End Sub
Private Sub prcGetPrinterPorts()
    'by Nepumuk
    Dim strBuffer As String
    Dim intIndex As Integer
    For intIndex = 0 To intPrinterCount - 1
        strBuffer = Space$(1024)
        GetProfileString "PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer)
        prcGetDriverAndPort strBuffer, strPrinterPorts(intIndex)
    Next
End Sub

Private Sub prcGetDriverAndPort(ByVal Buffer As String, PrinterPort As String)
    'by Nepumuk
    Dim intDriver As Integer
    Dim intPort As Integer
    PrinterPort = ""
    intDriver = InStr(Buffer, ",")
    If intDriver > 0 Then
        intPort = InStr(intDriver + 1, Buffer, ",")
        If intPort > 0 Then
            PrinterPort = Mid$(Buffer, intDriver + 1, intPort - intDriver - 1)
        End If
    End If
End Sub

Anschliessend erstellst du ein Klassenmodul und benennst dieses als "classAcroDist".
Dort fügst du diesen Code ein
Option Explicit

Public WithEvents myAdobeDist As PdfDistiller
Public blnFinished As Boolean

Private Sub Class_Initialize()
    Set myAdobeDist = New PdfDistiller
End Sub

Private Sub myAdobedist_OnJobDone(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
    blnFinished = True
    Kill strInputPostScript
End Sub

Private Sub myAdobedist_OnJobFail(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
    blnFinished = True
End Sub

Private Sub myAdobedist_OnJobStart(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
    blnFinished = False
End Sub


ACHTUNG:
Die Verweise müssen unbedingt im VB-Editor gesetzt sein, sonst hagelt es Fehlermeldungen
Viel Spass und gib Bescheid ob es funktioniert
Gruss Rainer
Anzeige
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 16:31:18
Jens
Hab jetzt alles im vb Editor eingetragen und versucht den script auszuführen- Fehlermeldungen!!
Was meinst du mit den Verweisen im Editor setzen- komme damit nicht klar!!
Jens
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 16:56:27
Jens
Mit den Verweisen habe ich jetzt hinbekommen aber beim ausführen kommt im Klassenmodul die Fehler meldung: Fehler beim Kompilieren: ungültiges Attribut bei Sub or Funktion an der Stelle "WithEvents myAdobeDist As PdfDistiller"
Hilfe!!!
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 17:07:29
Jens
Frage ist noch offen
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 19:06:16
Ramses
Hallo
Hast du auch den Verweis auf den PDF Distiller gesetzt ?
Gruss Rainer
AW: Einzelnes Tabellnblatt in PDF Datei speichern
27.02.2009 19:41:08
Jens
Hallo Rainer,
im VB editor unter Extras Verweise habe ich jeweils die Haken bei der ..Office Libary, Adobe Acrobat 8.0 Libary und Acrobat Distiller gesetzt!
Gruß Jens
Anzeige
Probier mal....
27.02.2009 21:34:04
Ramses
Hallo
Diese Verweise müssen gesetzt sein
Userbild
und hier die Beispielmappe
https://www.herber.de/bbs/user/59865.xls
Gerade mit Acrobat 9 getestet und funktioniert.
Gruss Rainer
AW: Probier mal....
28.02.2009 12:04:58
Jens
Hallo Rainer,
danke für die Testtabelle, nach mehrmaligen Fehlversuchen habe ich mal meinen Adobe PDF printer offline gesetzt- probiert (ging natürlich nicht)- Druck abgebrochen- wieder online gestezt und siehe da es geht- jetzt habe ich das Problem das wenn ich die PDF Datei abgespeichert habe und AAP schließe schmiert AAP ab.
Der "Druckprozess" selber ging relativ zügig.
Wäre es den möglich die Aufforderung zum Speichern der PDF Datei (Datei speichern unter; Pfad und Dateiname kann variieren sein) zu automatisieren?
Gruß und Danke schon mal!
Jens
Anzeige
AW: Probier mal....
28.02.2009 15:28:06
Jens
Hallo Rainer,
hab jetzt auch noch festgestellt das die ganze Arbeitsmappe in PDF ausgegeben wird- ich wollte aber eigentlich immer nur das aktuelle Tabellenblatt als PDF ausgeben!
MfG Jens Adler
AW: Probier mal....
28.02.2009 17:31:02
Heinz
Hi,
kopier das gewünschte Blatt in eine neue Mappe mit nur einem Blatt.
mfg Heinz
AW: Probier mal....
01.03.2009 11:30:32
Jens
Hallo Heinz,
da ich nur "bescheidene" VBA Kenntnise besitze müßte ich den Code haben und diesen mit Rainer's (Ramses') Code PDF drucken- derfunktioniert ja irgentwie zusammenbringen!
Keine Ahnung wie!
MfG und nochmals Danke Jens

324 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige