Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
816to820
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
816to820
816to820
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

PDF-Seriendruck über VBA steuern?

PDF-Seriendruck über VBA steuern?
12.11.2006 17:33:51
Sascha
Hallo Allerseits,
habe derzeit folgendes Problem. Wir haben in der Firma eine ganze Reihe Reports und eine Datenbank für Excel.
Nun drucke ich derzeit alle Reports immer für alle Niederlassungen auf Papier was weit über 300 Seiten pro Report ergibt. Das ganze läuft über eine Serienschleife in welcher alle Niederlassungsnummern enthalten sind. Es wird jeweils die Niederlassung eingestellt und dann über "Calculate" die Daten der Niederlassung abgerufen und danach wieder gedruckt. Danach folgt die nächste Niederlassung und so weiter.
Wünschenswert wäre ein Ausdruck in PDF-Dateien um diese per E-Mail zu versenden. Mit Adobe Acrobat Prof. 7.0 komme ich hier nicht weiter. Es gibt zwar einen sog. "Adobe PDF"-Drucker und man kann von Excel auch in diesen drucken als wenn man auf Papier drucken würde aber ich kann das ganze leider nicht automatisieren.
Versucht habe ich es schon über VBA mit SendKeys. Sozusagen, daß ich einfach statt auf Papier den Druckauftrag versende den Druckdialog per Sendkeys aufrufe und hier jeweils manuell die Niederlassungs-Nr. bei der Abfrage der PDF-Datei eingebe. Dies funktioniert leider nicht wirklich da Excel hier dann mit der Schleife durcheinander kommt. Irgendwie scheint das damit zusammenzuhängen, daß Microsoft Excel nicht mehr den "Focus" hat und man sich dann ja zwischenzeitlich in einem anderen Programm (Adobe PDF) befindet.
Gibt es hier eine Möglichkeit, evtl. direkt mit Adobe Acrobat (habe allerdings leider nichts gefunden) bzw. in Excel-VBA aus einer Datei mehrmals zu drucken und alle Drucke in verschiedenen Dateien mit verschiedenem Namen abzulegen?
Wünsche allen Forenlesern und Schreibern noch einen erholsamen Sonntagabend.
Sascha

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PDF-Seriendruck über VBA steuern?
12.11.2006 18:24:27
ramses
Hallo
Bei deinem Level solltest du das relativ einfach anpassen können :-)
Der Code ist eigentlich dafür gedacht, die aktuelle Tabelle als PDF zu drucken.
Mit einer Schleife kannst du den Code dann für deine Anforderungen anpassen indem du immer Print_to_PDF("DeineTabelle") aufrufst und als Parameter eben den Namen deiner Tabelle
'Adobe Print Job
'by Ramses

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)
    '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)
    '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
    '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

Dazu muss in die Mappe ein Klassenmodul erstellt werden mit dem Namen classAcroDist
In das Klassenmodul muss dieser Code
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


Viel Spass :-)
Gruss Rainer
Anzeige
AW: PDF-Seriendruck über VBA steuern?
12.11.2006 20:58:02
Luschi
Hallo Rainer,
leider läuft Dein Programmbeispiel nicht, da folgende Prozeduren/Funktionen nicht
definiert sind:
- GetProfileString
- prcGetPrinterNames
- prcGetPrinterPorts
Habe dazu unter: https://www.herber.de/forum/archiv/76to80/t77914.htm eine Lösung gefunden, möchte aber gern von Dir wissen, ob diese so korrekt ist.
Gruß von Luschi
aus klein-Paris
AW: PDF-Seriendruck über VBA steuern?
12.11.2006 21:05:07
ramses
Hallo Luschi
Danke für den Hinweis,... das ist beim kopieren tatsächlich vergessen gegangen :-(
Option Explicit
'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

Private Sub prcGetPrinterNames(ByVal strBuffer As String)
    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()
    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

Viel Spass beim ausprobieren :-)
Gruss Rainer
Anzeige
AW: PDF-Seriendruck über VBA steuern?
12.11.2006 21:35:49
Luschi
Hallo Rainer,
beim Testen kommt immer noch 1 Fehler, das "prcGetDriverAndPort" nicht gefunden wird.
Sorry, das ich hier drängle (und das noch am So-Abend), aber ich brauche das PDF-Drucken grad so so nötig.
Rainer, kennst Du eine Möglichkeit, das zu Druckende in eine Exceldatei zu schreiben?
Sozusagen: Druckbereich festlegen - Datei (drucken) - in Exceldatei
Gruß von Luschi
aus klein-Paris
AW: PDF-Seriendruck über VBA steuern?
12.11.2006 22:07:13
ramses
Hallo Luschi
hab mir nun eine Notiz gemacht, dass der KOMPLETTE Code zusammengehört :-)
Ich hatte das mal vor längerer Zeit geschrieben für einen Beitrag im Forum, aber was da noch alles zusammengehörte wusste ich nicht mehr :-)
Private Sub prcGetDriverAndPort(ByVal Buffer As String, PrinterPort As String)
    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

Gruss Rainer
Anzeige
PDF-Seriendruck über VBA steuern?
19.11.2006 13:56:00
Sascha
Hallo ramses! Hallo Luschi!
Hallo Allerseits!
Vielen Dank zuerst mal für die ganzen Beispiele. Ich werde das morgen alles mal ausprobieren. Wenn ich so sehe was ihr alles könnt muß ich wohl meinen Level eine Stufe runterschrauben ;)
Ich wünsche euch noch ein schönes Wochenende
Viele Grüße
Sascha
AW: PDF-Seriendruck über VBA steuern?
Martin
Hi,
Nur ei n Tippp
FreePDF XP ist ein PDF-Maker, der sich als Drucker installiert. Wenn Du den im Druckmenü in Excel einstellts, kannst Du den Makrorecorder mitlaufen lassen und sehen, wie in VBA ein bestimmter Drucker eingestellt wird. Es wird wohl auch möglich sein in VBA alle Dateien in einem Verzeichnis aufrufen und drucken zu lassen --- Suche hiflt hier.
Hoffentlich hilft es.
Martin
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige