Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: ironpete am Juli 03, 2014, 08:11:08

Titel: output to PDF --> wie wenn PDF geöffnet?
Beitrag von: ironpete am Juli 03, 2014, 08:11:08
Servus,

ich speichere einen Bericht als PDF und öffne ihn danach mittels

DoCmd.OutputTo acOutputReport, "rptErfassung", acFormatPDF, "c:\temp\rptErfassung.pdf", True

Wenn der Anwender die PDF minimiert, und den Befehl allerdings nochmals auslöst, kann der PDFBericht natürlich nicht gespeichert/überschrieben werden, weil die PDF ja noch geöffnet ist.

Kann man in diesem Fall automatisch eine zweite Version "c:\temp\rptErfassung_v2.pdf" erzeugen? Oder gibt es einen Befehl, mit dem die geöffnete Datei gezielt schließen kann?
Titel: Re: output to PDF --> wie wenn PDF geöffnet?
Beitrag von: Golfidur am Juli 03, 2014, 12:54:41
Hallo ironpete!

Folgender Vorschlag:

In ein Modul schreibe

Option Explicit

Function DateiIstFrei(sDateiname As String) As Boolean
Dim hFile As Integer
    On Error Resume Next
    hFile = FreeFile()
    Open sDateiname For Random Access Read Lock Read Write As #hFile
    If Err Then
      DateiIstFrei = False
    Else
      DateiIstFrei = True
    End If
    Close #hFile
End Function


Bevor du das neue pdf erstellst prüfe mit


If DateiIstFrei(PDF_Name) = False Then
MsgBox "Datei ist bereits geöffnet !"
... weitere Aktionen wie Schließen, neuer Name oä
else
... was auch immer
End If


Code habe ich auch mit Excel getestet und funktioniert.
Gerade bei Excel sollte man aber vorsichtig sein, da ein Schließen der Datei eventuell ja auch schon gemachte Änderungen verwirft wenn man nicht aufpasst

LG
Golfidur
Titel: Re: output to PDF --> wie wenn PDF geöffnet?
Beitrag von: ironpete am Juli 04, 2014, 08:17:39
Danke. ich habe es so gelöst:

Option Compare Database
Option Explicit

Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const WM_CLOSE = &H10

-----------------------------------------------------
Public Sub SchliessePdf(strDatei As String)

    Dim hwnd As Long
   
    hwnd = FindWindow(vbNullString, strDatei & " - Adobe Reader")
   
    If hwnd <> 0 Then
        Call SendMessage(hwnd, WM_CLOSE, 0, 0)
    End If

End Sub