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

Tabelle als PDF speichern

Tabelle als PDF speichern
25.10.2008 23:06:00
PeTeR
Hallo VBA-Freaks,
ich suche seit Stunden - finde aber nicht den exakt passenden Code, obwohl es zig Einträge zu dem Thema gibt.
Ich will eine Tabelle per VBA in PDF umwandeln u. drucken. Mein Code:
Application.ActivePrinter = "Adobe PDF auf Ne01:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"Adobe PDF auf Ne01:", Collate:=True
Nun öffnet sich das Adobe-Fenster "Speichern unter" für den Dateinamen zum Speichern.
Wie kann ich Dateiname und Pfad im Makro hinterlegen, so dass sich das "Speichern unter" NICHT öffnet?
Vielen Dank für eure Hilfe
PeTeR

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle als PDF speichern
26.10.2008 10:09:00
OttoH
Hallo Peter,
das wird nicht gehen; von VBA aus kann man meines Erachtens keinen Pfad oder Dateinamen an Adobe vorgeben.
Ich habe mal folgende Umgehungslösung gebastelt:
- Adobe so einstellen, dass es immer denselben Dateinamen als Ausgabe benutzt
- dann per VBA die Datei dahin kopieren, wo sie stehen soll und den gewünschten Namen vergeben.
Gruß OttoH
AW: Tabelle als PDF speichern
26.10.2008 10:25:00
PeTeR
Hallo Otto,
vielen Dank für deinen Tip!
Adobe verwendet den Dateinamen der Exceldatei und einen Standardpfad. Wie kann ich in Adobe verhindern, dass sich der "Speichern - unter"-Dialog öffnet?
Ausserdem gebe ich die Hoffnung auf eine etwas "direktere" Lösung noch nicht auf.
Vielen Dank für weitere Vorschläge
PeTeR
Anzeige
Der direkte Weg...
26.10.2008 13:26:49
Ramses
Hallo
ist deutlich umfangreicher als du vielleicht meinst.
Getestet ist das ganze mit Adobe Acrobat 6 und 7.
Es geht NICHT mit dem Acrobat Reader
Das alles gehört in ein Modul
'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
    '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)
            Exit For
        End If
    Next
End Function


'Nur zur Entwicklung nötig
Public Sub Print_PrinterList()
    '(C) by Ramses
    'gibt alle installierten Drucker im Debug.Fenster aus
    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 - 1
        'If InStr(1, strPrinterNames(intIndex), "Adobe") > 0 Then
        Debug.Print strPrinterNames(intIndex) & " auf " & strPrinterPorts(intIndex)
        'End If
    Next intIndex
End Sub

'********************************************************
'Das gehört in ein Klassenmodul deiner Arbeitsmappe
'Das Klassenmodul muss in diesem Beispiel
'den Namen "classAcroDist" haben

Das hier gehört in ein Klassenmodul !! mit dem Namen "classAcroDist"
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: Der direkte Weg...
26.10.2008 15:18:54
PeTeR
Hallo Rainer,
tausend Dank für deine Profi-Lösung. Ehrlich gesagt bin ich bei meinen Recherchen oft auf deinen Namen gestoßen - habe aber das Makro einfach nicht gefunden. Umso mehr hatte ich gehofft, von dir unterstützt zu werden!!
Um das Makro zu verstehen, werde ich noch ein Weilchen brauchen. Am Mo. kann ich es dann auch direkt vor Ort testen. Ich hoffe nur, dass der Distiller auch wirklich installiert ist.
Nochmals vielen Dank
PeTeR

347 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige