Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Pdf Datei aus Access VBA drucken

Begonnen von tommytulpe, April 09, 2024, 13:52:32

⏪ vorheriges - nächstes ⏩

tommytulpe

Guten Tag!
Ich möchte eine PDF-Datei die ich per VBA erstelle auch ausdrucken.
Das funktioniert leider nicht: 

Option Compare Database
Option Explicit

Declare PtrSafe Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As _
String, ByVal nShowCmd As Long) As LongPtr
   
Public hwnd As Long
Public Const SW_HIDE = 0          ' Versteckt öffnen
Public Const SW_MAXIMIZE = 3      ' Maximiert öffnen
Public Const SW_MINIMIZE = 6      ' Minimiert öffnen
Public Const SW_NORMAL = 1
Public Const SW_RESTORE = 9
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWNOACTIVATE = 4

Public Function DateiOeffnen(Aktion As String, Pfad As String, _
                             Ansicht As Long) As Boolean
    Call ShellExecute(0, Aktion, Pfad, "", "", Ansicht)
End Function

Aufruf:

'
' Dokument als PDF ausgeben
'
    pdfPath = "\\HGVNAS\Public\Inventuren\Inventur " & DInv
    objDocument.ExportAsFixedFormat OutputFileName:=pdfPath, ExportFormat:=wdExportFormatPDF

Das funktioniert!

DateiOeffnen "print", pdfPath, SW_MAXIMIZE

Da passiert gar nichts!

Kann mir da jemand helfen?

Vielen Dank für Eure Unterstützung.



PhilS

Ich erkenne keinen offensichtlichen Fehler in deinem Code.

Schau doch mal:
a) Was passiert, wenn du anstelle von "print" "open" angibst oder die Aktion komplett weglässt.
b) Was der Rückgabewert von ShellExecute ist. Wenn nichts passiert, sollte das der Fehlercode sein.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Hallo PhilS,

bei Aktion open passiert ebenfalls nichts
Aktion "" leer passiert auch nichts
Wie kann ich den Rückgabewert von ShellExecute auslesen?

PhilS

Dim Rueckgabe as Long
Rueckgabe = ShellExecute(....
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Hallo PhilS,

sorry ich weiß wirklich nicht wohin mit Rueckgabe

 Call ShellExecute(0, Aktion, Pfad, "", "", Ansicht)

Vor dem Call oder in Klammern?

PhilS


Ok, ich dachte meine Codeskizze wäre aussagefähig genug.
Hier ausführlicher:
Dim Rueckgabe as Long
Rueckgabe =  ShellExecute(0, Aktion, Pfad, "", "", Ansicht)
MsgBox  Rueckgabe

Werte < 32 sind Fehlercodes.
Zur Info nachfolgend die Konstanten der Error Codes aus shellapi.h:

/* ShellExecute() and ShellExecuteEx() error codes */

/* regular WinExec() codes */
#define SE_ERR_FNF              2      // file not found
#define SE_ERR_PNF              3      // path not found
#define SE_ERR_ACCESSDENIED    5      // access denied
#define SE_ERR_OOM              8      // out of memory
#define SE_ERR_DLLNOTFOUND              32

/* error values for ShellExecute() beyond the regular WinExec() codes */
#define SE_ERR_SHARE                    26
#define SE_ERR_ASSOCINCOMPLETE          27
#define SE_ERR_DDETIMEOUT              28
#define SE_ERR_DDEFAIL                  29
#define SE_ERR_DDEBUSY                  30
#define SE_ERR_NOASSOC                  31

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Public Function DateiOeffnen(Aktion As String, Pfad As String, _
                             Ansicht As Long) As Boolean
    Dim Rueckgabe As Long
    Rueckgabe = ShellExecute(0, Aktion, Pfad, "", "", Ansicht)
    MsgBox Rueckgabe
End Function

führt aber zu einer Typenunverträglichkeit

PhilS

Zitat von: tommytulpe am April 09, 2024, 16:54:12führt aber zu einer Typenunverträglichkeit
Stimmt.

Dim Rueckgabe As LongPtr
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Also Fehlerode = 2

Kann aber nicht sein, Datei ist ja da.

Erklärung wäre ob in der ShellExecute kein UNC-Pfad erlaubt ist.
   
pdfPath = "\\HGVNAS\Public\Inventuren\Inventur " & DInv
    objDocument.ExportAsFixedFormat OutputFileName:=pdfPath, ExportFormat:=wdExportFormatPDF
    DateiOeffnen "print", pdfPath, SW_MAXIMIZE


PhilS

Zitat von: tommytulpe am April 09, 2024, 17:28:47Erklärung wäre ob in der ShellExecute kein UNC-Pfad erlaubt ist.
Das ist definitiv nicht der Fall.
Mein Verdacht wäre eher, dass ExportAsFixedFormat die Datei noch gar nicht vollständig geschrieben hat, wenn bereits DateiOeffnen ausgeführt wird.
Das solltest du mal prüfen, indem du die beiden Operationen unabhängig voneinander ausführst.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Hallo PhilS,

ich muss mich tausend mal entschuldigen, das ich deine Zeit gestohlen habe.

In Pfad stand drin wo und mit welchem Namen das PDF ausgegeben wird.
Um das dann zu drucken muss ich natürlich den kompletten Pfad und Dateinahmen angeben....also mit .pdf.

In diesem Fall saß der Fehler wieder hinter der Tastatur.
Das funktioniert also problemlos.

Nochmal vielen Dank für deine Geduld und Unterstützung.
Ich setze das Thema auf erledigt.

tommytulpe

Ganz kurze Frage:

da geht dann beim drucken das PDF-Programm auf.

Kann man das unterdrücken:

PhilS

#12
Zitat von: tommytulpe am April 09, 2024, 19:44:14da geht dann beim drucken das PDF-Programm auf.

Kann man das unterdrücken:
Wenn das PDF Programm das nShowCmd Argument von ShellExecute beachtet, dann ja.
Also, dass das PDF Programm geöffnet wird kann man nicht unterdrücken, das muss es ja damit es drucken kann. Aber das sollte auch funktionieren, wenn das Programm nur unsichtbar geöffnet wird.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

tommytulpe

Okay, dann lass ich das so.
Vielen Dank nochmal und gute Zeit!