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

PDF ausdrucken- Hilfe beim Öffnen des Files

PDF ausdrucken- Hilfe beim Öffnen des Files
06.09.2005 16:46:23
BEATE
Hallo!
Hab ein großes Problem:
Hab Dank einiger Spezialisten hier einen Supertollen Code mit dem ich ein pdf ausdrucken kann und der Name sowie der pfad aus den Zellen entnommen wird.
Es funktioniert auch, dass Acrobat sich öffnet, allerdings wird die gedruckte Datei nicht angezeigt. Was kann ich tun?
Bin dankbar für jede Hilfe
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
Sub Start_Print()
'by Ramses
'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
'*********************************
'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 = Worksheets("Tabelle1").Cells(2, 2).Text
'Dann wechsle vorher in den Pfad der Datei
ChDrive (Left(strFileToPrintPfad, 2))
ChDir strFileToPrintPfad
'Zur druckender: Mappenname_Tabelle1
strFilename = strFileToPrintPfad & "\" & Worksheets("Tabelle1").Cells(2, 1).Text
'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
Open_PDF DistOutputPDF
'Alten Drucker wieder herstellen
Application.ActivePrinter = oldActivePrinter
'Variablen leeren
Set myAdobeDist = Nothing
End Sub
Function Get_Adobe_Printer() As String
'Adobe Drucker bestimmen
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

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)
Debug.Print GetProfileString("PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer))
GetProfileString "PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer)
prcGetDriverAndPort strBuffer, strPrinterPorts(intIndex)
Next
End Sub


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)
Debug.Print PrinterPort
End If
End If
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 "Fehler: Das Dokument :"" & FileToOpen & "" kann nicht geöffnet werden", vbInformation
End If
Set myAdobeView = Nothing
Set myAdobeDoc = Nothing
Set myAdobeAc = Nothing
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: PDF ausdrucken- Hilfe beim Öffnen des Files
06.09.2005 17:17:14
denis
habe auch sowas gemacht - funzt super .
habe mir deinen code nicht angesehen - (wiel ich ihn als Laie nicht verstehen würde) aber ich denke mit preview:=tree ist die vorschau möglich.
Range("i1:o1").Select
ActiveCell.FormulaR1C1 = "LIST OF OPEN POINTS"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:="FreePDF XP auf Ne04:", Preview:=True, Collate:=True
Danke - geht leider noch immer nicht!
06.09.2005 17:24:35
BEATE
Hi!
Vielen Dank für den netten Hinweis. Die Funktion Preview gibt es leider nicht in meinem code.
Danke trotzdem
Gruß Beate
AW: Danke - geht leider noch immer nicht!
06.09.2005 18:18:52
Nepumuk
Hallo Beate,
ein anderer Ansatz:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

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 Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" ( _
    ByVal lpszLongPath As String, _
    ByVal lpszShortPath As String, _
    ByVal cchBuffer As Long) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long

Private Const MAX_PATH = 260&
Private Const SW_MAXIMIZE = 3&
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


Sub Start_Print()
    'by Ramses
    '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
    '*********************************
    'Zusätzlich wird das Klassenmodul classAcroDist benötigt
    Dim myAdobeDist As classAcroDist 'see class module
    Dim myWB As Workbook
    Dim strFilename As String
    Dim strFileToPrintPath 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
    strFileToPrintPath = Worksheets("Tabelle1").Cells(2, 2).Text & "\"
    'Dann wechsle vorher in den Pfad der Datei
    ChDrive (Left(strFileToPrintPath, 2))
    ChDir strFileToPrintPath
    'Zur druckender: Mappenname_Tabelle1
    strFilename = Worksheets("Tabelle1").Cells(2, 1).Text
    'EXCEL kann nur PS-Files direkt drucken
    'daher muss sowohl PS-File wie auch PDF-File definiert werden
    DistInputPS = strFileToPrintPath & strFilename & ".ps"
    DistOutputPDF = strFileToPrintPath & 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
    Call Open_PDF(strFileToPrintPath, strFilename)
    'Alten Drucker wieder herstellen
    Application.ActivePrinter = oldActivePrinter
    'Variablen leeren
    Set myAdobeDist = Nothing
End Sub

Function Get_Adobe_Printer() As String
    'Adobe Drucker bestimmen
    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

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)
        Debug.Print GetProfileString("PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer))
        GetProfileString "PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer)
        prcGetDriverAndPort strBuffer, strPrinterPorts(intIndex)
    Next
End Sub

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)
            Debug.Print PrinterPort
        End If
    End If
End Sub

Sub Open_PDF(strPath As String, strFile As String)
    'by Nepumuk
    Dim strShortPath As String
    strShortPath = Space(MAX_PATH)
    GetShortPathName strPath & strFile, strShortPath, MAX_PATH
    strShortPath = Left$(strShortPath, InStr(1, strShortPath, vbNullChar) - 1)
    ShellExecute GetActiveWindow, "open", strShortPath, "", strPath, SW_MAXIMIZE
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Danke - geht leider noch immer nicht!
BEATE
Hallo Nepomuk!
Du hast mir ja gestern wirklich unglaublich viel geholfen. Hab nun deinen Code ausprobiert und hab leider folgende Fehlermeldung bekommen:
Ungültiger Prozeduraufruf oder ungültiges Argument.
Tja jetzt steh ich wirklich komplett an...
Trotzdem vielen, vielen Dank oder vielleicht kennst Du doch noch die richtige Lösung des Problems?
LIEBE GRüßE
BEATE
AW: Danke - geht leider noch immer nicht!
06.09.2005 18:32:10
Nepumuk
Hallo Beate,
Welche Zeile markiert der Debugger?
Gruß
Nepumuk
Excel & VBA – Beispiele
AW: Danke - geht leider noch immer nicht!
06.09.2005 18:37:45
BEATE
Hallo Nepumuk!
Leider markiert er gar keine Zeile. Ich habe das Makro über VBA_Editor ausgeführt. Dann legt er erfolgreich das File ab und schreibt. Print erfolgreich.
Dann kommt diese Meldung in eine VBA Fenster?
Vielen Dank für Deine Mühe! das ist wirklich sehr sehr nett von Dir.
PS: Sollt ich nicht gleich zurückposten liegt es daran, dass ich für 1 Stunde kurz weg muss. Sorry
LG BEATE
Anzeige
Warum....
06.09.2005 19:08:18
Ramses
Hallo
auch wenn du auf meinen Beitrag nicht mehr geantwortet hast,....
Wird diese Fehlermeldung angezeigt ?
Userbild
Pfad natürlich entsprechend deiner Vorgabe
Wenn NEIN, dann ist das File geöffnet.
Gruss Rainer
AW: Warum....
06.09.2005 20:57:35
BEATE
Hallo Rainer!
Sorry das ich nicht mehr geantwortet habe - war so vertieft in meine Arbeit...
Auch Dir vielen herzlichen Dank für Deine Hilfe!!!
Fehleranzeige ist wie folgt.
Microsoft Visual Basic
Ungültiger Prozeduraufruf oder ungültiges Argument.
Wie gesagt: Die Datei wird erfolgreich angelegt.
Jetzt hab ich es nochmal ausprobiert und der Acrobat öffnet sich nicht mehr - komisch?
Naja was soll ich sagen - hoffentlich ist das nicht das Ende Euer mühevollen Hilfe.
VIELEN DANK AN ALLE
LG BEATE
Anzeige
AW: Warum....
06.09.2005 21:03:45
Ramses
Hallo
Normalerweise bietet dir EXCEL in dem Dialog einen Button "Debuggen" an, klick mal drauf, und schau welche Zeile markiert wird.
Gruss Rainer
AW: Warum....
06.09.2005 21:22:37
BEATE
Hallo Rainer!
Bin nun alles im Einzelschritt durchgegangen die Fehlermeldung einmal wie bereits erwähnt sowie Laufzeitfehler ´5´ tritt auf bei folgendem Abschnitt:

Sub Open_PDF(strPath As String, strFile As String)
'by Nepumuk
Dim strShortPath As String
strShortPath = Space(MAX_PATH)
GetShortPathName strPath & strFile, strShortPath, MAX_PATH
>>>strShortPath = Left$(strShortPath, InStr(1, strShortPath, vbNullChar) - 1)
ShellExecute GetActiveWindow, "open", strShortPath, "", strPath, SW_MAXIMIZE
End Sub

(Fehler in der von mir markierten Zeile mit >>>)
Ich hoffe das hilft weiter. Sind nur mehr 2 Zeilen bis zum Ziel.
Aber das Ziel ist leider noch nicht erreicht.
In jedem Fall vielen vielen Dank für den unermüdlichen Einsatz
LIEBE GRÜße
BEATE
Anzeige
AW: Warum....
06.09.2005 21:31:56
Nepumuk
Hallo Beate,
ändere die Zeile:
Call Open_PDF(strFileToPrintPath, strFilename)
so:
Call Open_PDF(strFileToPrintPath, strFilename & ".pdf")
Gruß
Nepumuk
Excel & VBA – Beispiele
HURRA HURRA HURRA HURRA
06.09.2005 21:42:58
BEATE
Liebe Leute!
Ich kann es gar nicht glauben. Es hat funktioniert!!!
Vielen vielen vielen Dank an alle die so tatkräftig geholfen haben!!!
Ich wünsche Euch noch einen schönen Abend und schließe Euch in mein Abendgebet ein!!
ALLES LIEBE
BEATE
AW: Warum....
06.09.2005 22:03:07
Ramses
Hallo Nepumuk
Hab's nun auch endlich gefunden.
Wenn man endlich die Liste mit den DLL-Error-Codes gefunden hat, ist es eigentlich ganz einfach:-)
Gruss Rainer
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige