Hai un approccio che non è molto tecnico su cui io non riesco a darti un supporto.
Ti dico però come farei io.
1) Gestione errori nella Sub/Function di salvataggio Report
2) Prima di Generare eseguo un KILL preventivo, se va in ERRORE per assenza del File(intercetto il N° Errore specifico che dovrebbe essere il 53)
3) Se va in errore perchè il File è APERTO, ErrNum=70 (Autorizzazione negata) allora puoi decidere se forzarne la chiusura...
Per la chiusura sapendo che è un PDF e basta come possibilità semplificata, hai varie opzioni la più semplice è quella che ti mostro sotto, ovvero usare WMI per identificare tra gli EXE quello di AcroRd32.exe e, identificare esattamente il processo che agisce sul File Aperto, e Terminarlo...
A quel punto puoi generare il REPORT in PDF.
Per semplicità ti allego un codice semplificato di Esempio:
Function GeneraReportPDF()
Dim sReportPDF As String
Dim sPath As String
On Error GoTo Err_Handler
sPath = "C:\"
sReportPDF = sPath & "NomeFile.pdf"
TryKill:
Kill sReportPDF
' QUI' GENERI IL TUO PDF
DoCmd.OpenReport reportName, acViewPreview, , criteria, acHidden
DoCmd.OutputTo acOutputReport, reportName, acFormatPDF, fileName
DoCmd.Close acReport, reportName, acSaveNo
Exit Function
Err_Handler:
Select Case Err.Number
Case 53
Resume Next
Case 70
If TerminatePDF(sReportPDF) Then
Resume TryKill
Else
Err.Raise 10001, "Termination", "Il tentativo di Chiusura è fallito... ora obbliga l'utente a chiuderlo e riprovare..!"
End If
Case Else
MsgBox Err.Description, vbCritical, "ERR Num = " & Err.Number
End Select
End Function
Function TerminatePDF(strFileToClose As String) As Boolean
On Error Resume Next
Dim objWMIService
Dim colProcessList
Dim objProcess
Dim strComputer As String
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'AcroRd32.exe'")
For Each objProcess In colProcessList
If InStr(objProcess.CommandLine, strFileToClose) > 0 Then
objProcess.Terminate
TerminatePDF= True
End If
Next
End Function