4

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 
1

2 Answers 2

11

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 
Sign up to request clarification or add additional context in comments.

2 Comments

+1 Great Answer, also because it can be used to test for many file types by adjusting accordingly :)
Unfortunately for me when running Open filename For Input Lock Read As #ff I get a permission error, which also can't be caught...
1

Works for me when I removed the - Acrobat Reader DC (64-bit) extension. You need to delay the code by 50 milliseconds, or more if you want to use the same filename after closing the older version of the file.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.