Check if a certain pdf file is open and close it

26,527

To check if the file is open or not, you can see the code that I posted HERE So the usage will be

Sub Sample()
    Dim Ret

    '~~> Change this to the relevant file path and name
    Ret = IsFileOpen("C:\Current Letter Preview.Pdf")

    If Ret = True Then
        MsgBox "File is open"
    Else
        MsgBox "File is Closed"
    End If
End Sub

Function IsFileOpen(FileName As String)
    Dim ff As Long, ErrNo As Long

    On Error Resume Next
    ff = FreeFile()
    Open FileName For Input Lock Read As #ff
    Close ff
    ErrNo = Err
    On Error GoTo 0

    Select Case ErrNo
    Case 0:    IsFileOpen = False
    Case 70:   IsFileOpen = True
    Case Else: Error ErrNo
    End Select
End Function

And to close a file, you will have to use APIs FindWindow and PostMessage

I have tested the code with Adobe Reader and hence in the code below, the name that I am searching for is "Current Letter Preview.pdf - Adobe Reader" You may have a different name. Please change as applicable.

Option Explicit

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassname As String, ByVal lpWindowName As String) As Long

Private Const WM_CLOSE = &H10

Sub Sample()
    Dim Hwnd As Long

    '~~> Find the window of the pdf file
    Hwnd = FindWindow(vbNullString, "Current Letter Preview.pdf - Adobe Reader")

    If Hwnd Then
        '~~> Close the file
        PostMessage Hwnd, WM_CLOSE, 0, ByVal 0&
    Else
        MsgBox "Pdf File not found"
    End If
End Sub
Share:
26,527

Related videos on Youtube

user3286479
Author by

user3286479

Updated on September 08, 2020

Comments

  • user3286479
    user3286479 over 3 years

    I use this code to export a pdf file from a word document.

    Before exporting I need to check first if a file with the same name is already open, and if so close it then export.

    I tried many things but had no luck.

    Dim adbApp As Acrobat.AcroApp
    Dim adbDoc As Acrobat.AcroAVDoc
    Dim adbPageView As Acrobat.AcroAVPageView
    
    Set adbApp = CreateObject("AcroExch.App")
    Set adbDoc = CreateObject("AcroExch.AVDoc")
    
    If adbDoc.Open("C:\Current Letter Preview.pdf", "") = True Then '==> If the file is not open, this line opens it
        adbDoc.Close (1) '==> Then close it
    
        If adbDoc Is Nothing Then '==> Doesn't understand that I want to check if any pdf files are open
            adbApp.Exit
        End If
    
        Set adbApp = Nothing
    End If
    
    Dim wordApp As Word.Application
    Dim wordDoc As Word.Document
    
    If IsFileOpen("C:\TemporaryLetter.docx") Then
        Set wordApp = GetObject(, "Word.Application")
        wordApp.Documents("C:\TemporaryLetter.docx").Close '==> Is there something like that regarding acrobat IAC?
    Else
        Set wordApp = CreateObject("Word.Application")
    
        With wordApp
            .Visible = True
            .WindowState = 2
        End With
    End If
    
    Set wordDoc = wordApp.Documents.Open("C:\TemporaryLetter.docx")
    
    wordDoc.ExportAsFixedFormat OutputFileName:="C:\Current Letter Preview.pdf", _
    ExportFormat:=wdExportFormatPDF
    
    wordDoc.Close savechanges:=wdDoNotSaveChanges
    
    Set wordDoc = Nothing
    
    If wordDoc Is Nothing Then
        wordApp.Quit
    End If
    
    Set wordApp = Nothing
    
    Call adbDoc.Open("C:\Current Letter Preview.pdf", "")
    
    adbDoc.BringToFront
    
    Set adbPageView = adbDoc.GetAVPageView()
    
    Call adbPageView.ZoomTo(0, 100)
    
    Set adbDoc = Nothing
    Set adbPageView = Nothing
    
  • CaptainABC
    CaptainABC over 9 years
    +1 Great Answer, also because it can be used to test for many file types by adjusting accordingly :)
  • Sancarn
    Sancarn almost 6 years
    Unfortunately for me when running Open filename For Input Lock Read As #ff I get a permission error, which also can't be caught...