Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1188to1192
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

pdf erstellen und Dateibezeichnung aus Zelle

pdf erstellen und Dateibezeichnung aus Zelle
Bastian
Hallo Forum,
ich möchte ein Diagramm in eine pdf-Datei umwandeln. Der Dateiname der pdf soll aus dem Inhalt (Text) einer Zelle entnommen werden. Die Datei soll in einem vorgegebenen Pfad abgespeichert werden.
Dies müsste über ein Makro realisiert werden.
Kann mir einer helfen? Wäre toll!
Viele Grüße
Bastian

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: pdf erstellen und Dateibezeichnung aus Zelle
29.11.2010 17:30:29
Ramses
Hallo
Welchen PDF Drucker verwendest du ?
Es ist nicht mit jedem PDF-Printer möglich.
Gruss Rainer
AW: pdf erstellen und Dateibezeichnung aus Zelle
29.11.2010 17:36:39
Bastian
Hallo Rainer,
es nennt sich Adobe PDF-Converter
Gruß, Bastian
Noch offen:
29.11.2010 19:14:17
Ramses
Hallo
Sorry,... mit dem PDF Converter habe ich keine Erfahrung.
Aber du kannst das ja mal probieren. Der Code ist für den Adobe Acrobat geschrieben.
Alternativ gibt es noch einige andere PDF-Treiber die etwas handlicheren VBA Code ermöglichen.
Der Code gehört in ein normales Modul deiner Mappe
Option Explicit
'Code zur Verwendung mit Adobe Acrobat 6./7.0/8.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
'**********************************************
'Mit dieser Sequenz wird der Ausdruck gestartet
Sub Start_Print()
    'Druckt die übergebene 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" (Apllication)
    '*********************************
    'Zusätzlich wird das Klassenmodul classAcroDist benötigt
    '*********************************
    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
    '************************
    'oder alternativ den Dateinamen aus einer Zelle drucken in das Verzeichnis der aktuellen Mappe drucken
    'Der Dateiname darf KEINE Dateierweiterung wie ".pdf" enthalten !!!!!!!!!!!!!!!!
    'strFilename = ThisWorkbook.Path & "\" & Range("A1")
    '************************
    '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 muss gesetzt sein !!!
    '****************
    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)
            Exit For
        End If
    Next
End Function


'Nachfolgende Prozeduren sind nötig für die korrekte Ausführung
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

ACHTUNG:
Das ist der fast wichtigste Teil
'********************************************************
'Das gehört in ein Klassenmodul deiner Arbeitsmappe
'Das Klassenmodul muss in diesem Beispiel
'den Namen "classAcroDist" haben
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

Gruss Rainer
Anzeige
AW: Noch offen:
30.11.2010 10:05:34
Bastian
Hallo Reiner,
vielen Dank für Deine Hilfe. Das Makro ist ja sehr kompliziert aber dafür gut kommentiert.
In der Zeile
Dim myAdobeDist As classAcroDist
gibt es die Fehlermeldung "Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert"
Ich glaube der Weg ist zu kompliziert für mich. Ich müsste das Makro noch in ein anderes verschachteln (siehe meine vorherige Anfrage) und den Namen der Pdf aus einem anderen Tabellenblatt beziehen usw.
Trotzdem vielen Dank.
Bastian
AW: Noch offen:
30.11.2010 11:44:05
Ramses
Hallo
"...aber dafür gut kommentiert...."
Dann sollte der Fehler aber nicht auftauchen :-)
Der untere Teil muss in ein KLASSENMODUL wie beschrieben, auch der Namen des Klassenmoduls muss entsprechend der Dokumentation stimmen.
Wenn du das ganze durchliest, dann weisst du auch wie du den Namen aus einer Zelle erhältst
Gruss Rainer
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige