1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| ' Fonction qui vérifie si l'application est déjà ouverte dans la même session Windows
Public Function VerifierInstanceUnique() As Boolean
Dim FichierLock As String
Dim Contenu As String
Dim NumFichier As Integer
Dim ChaineRecherche As String
Dim Pos As Long
Dim Occurrences As Integer
' 1. Construire le chemin du fichier de verrouillage (.laccdb ou .ldb)
' CurrentProject.FullName donne le chemin complet du fichier actuel (ex: C:\Base.accdb)
FichierLock = Left(CurrentProject.FullName, InStrRev(CurrentProject.FullName, ".")) & "laccdb"
' Si vous utilisez un vieux format (.mdb), décommentez la ligne suivante :
' FichierLock = Left(CurrentProject.FullName, InStrRev(CurrentProject.FullName, ".")) & "ldb"
' 2. Vérifier si le fichier de verrouillage existe (il devrait, puisque cette instance est ouverte)
If Dir(FichierLock) = "" Then
VerifierInstanceUnique = True
Exit Function
End If
' 3. Construire la chaîne à chercher : "NomOrdinateur" et "NomUtilisateur"
' Access formate souvent le fichier avec le nom de la machine suivi du login
ChaineRecherche = Environ("COMPUTERNAME")
' 4. Lire le fichier .laccdb (en mode partagé pour ne pas bloquer Access)
NumFichier = FreeFile
Open FichierLock For Binary Access Read Shared As #NumFichier
Contenu = Space$(LOF(NumFichier))
Get #NumFichier, , Contenu
Close #NumFichier
' 5. Compter combien de fois le nom de l'ordinateur apparaît
' (Pour être encore plus précis dans la même session, on cherche l'ordinateur.
' Si l'utilisateur lance une 2e instance, l'ordinateur apparaîtra 2 fois)
Pos = InStr(1, Contenu, ChaineRecherche, vbTextCompare)
Do While Pos > 0
Occurrences = Occurrences + 1
Pos = InStr(Pos + 1, Contenu, ChaineRecherche, vbTextCompare)
Loop
' 6. Si l'ordinateur apparaît plus d'une fois, c'est qu'une autre instance tourne
If Occurrences > 1 Then
MsgBox "L'application est déjà ouverte dans votre session Windows.", _
vbCritical + vbOKOnly, "Instance déjà active"
' On ferme proprement cette deuxième instance à la suite dans la macro appelante si : VerifierInstanceUnique = False
VerifierInstanceUnique = False
Else
VerifierInstanceUnique = True
End If
End Function |
Partager