1) Quand on veut ouvrir (manuellement ou par macro) un fichier Excel déjà ouvert, et non partagé, Excel renvoie un avertissement (Fermer, Avertir, Ouvrir en lecture seule): Les macros n'aiment pas ça...
2) En mode partagé, c'est à la fermeture qu'il pourra être demandé de valider une modification aux utilisateurs connectés...
C'est en général là que les problèmes se posent et que bien des utilisateurs ne savent pas vraiment quoi faire : Raison pour laquelle l'utilisation en mode partagé n'est pas du tout recommandée.
3) Il y a (au moins) deux métodes pour "avertir" que le fichier source qu'on veut ouvrir l'est déjà sans proposer l'avertissement par défaut d'Excel :
= > 3a) Si l'appel est fait par une macro, elle analyse l'ouverture existante par API, renvoie éventuellement un msgBox, et ferme l'appel.
= > 3b) Si l'appel se fait par un raccourci pointant sur le fichier source, on crée un fichier Excel "tampon" qui comportera une macro comme au 3a) : Le raccourci pointera sur ce fichier d'appel et non plus sur le fichier source
Je te propose le code ci-dessous à inclure dans un fichier d'appel (Excel) de ton fichier
Dans ThisWorkbook
Private Sub Workbook_Open() 'A l'ouverture...
MonExcelOpened
Dans un module
Private Declare Function SetCurrentDirectoryA Lib "kernel32" (ByVal lpPathName As String) As Long 'Fonction d'appel d'un répertoire
'************************************************************************************
Sub MonExcelOpened() 'Vérifie si le classeur Text.xls est déjà ouvert
Dim Chemin As String
Chemin = "chemin de mon fichier"
SetUNCPath Chemin 'appelle la recherche du chemin valide par SetUNCPath
End Sub
'************************************************************************************
Sub SetUNCPath(Path As String) 'Recherche sur l'état de monficier Excel
Dim Chemin, Monfichier As String
Chemin = "chemin de mon fichier"
Monfichier = "nom de mon fichier"
Dim Status As Long
Status = SetCurrentDirectoryA(Path) 'renvoie une valeur fonction de la réponse à la rcherche du chemin
Dim filenum As Integer, errnum As Integer
Set fso = CreateObject("Scripting.FileSystemObject") 'instancie l'API fso
If Status = 0 Then 'le chemin est valide
If (fso.FileExists(Chemin & Monfichier)) = False Then 'le chemin esxiste mais pas le fichier...
MsgBox " Désolé, Le fichier n'existe pas ", vbCritical, "Application absente !"
ThisWorkbook.Close savechanges:=False 'Fermeture du fichier d'appel
Else 'le chemin et le fichier existent
On Error Resume Next 'En cas d'erreur, passer à la recherche d'erreur suivante
filenum = FreeFile() 'Obtenir un numéro de Fichier de Test.
Open Chemin & Monfichier For Input Lock Read As #filenum 'tente d'ouvrir le fichier et de le verrouiller
Close filenum 'Ferme le fichier de Test
errnum = Err 'Reprend le N° d'erreur trouvé
On Error GoTo 0 'Relance la boucle de recherche d'erreur
If errnum = 0 Then 'Pas d'erreur reconnue: le Programme peut être ouvert !
Workbooks.Open Chemin & Monfichier 'Appelle l'ouverture du Programme
ThisWorkbook.Close savechanges:=False 'Fermeture du fichier d'appel
ElseIf errnum = 70 And User <> "" Then 'l'erreur N° 70 a été rencontrée: le programme est déjà ouvert par un autre utilisateur...
MsgBox "Vous ne pouvez pas lancer le Programme." & vbCrLf & _
"Un autre utilisateur est déjà connecté." _
, vbCritical, "Utilisateur déjà connecté..." 'Message avec le NOM Prénom (téléphone) de l'uitilisateur connecté
ThisWorkbook.Close savechanges:=False 'Fermeture du fichier d'appel
Else 'Une erreur inattendue s'est produite...!
MsgBox " Erreur Inattendue N° " & errnum & vbCrLf & _
" Le Programme est inaccessible." & vbCrLf & _
"Vérifiez vos paramètres de connexion. ", vbCritical, "Erreur Critique" 'Message renvoyant le N° de l'erreur
ThisWorkbook.Close savechanges:=False 'Fermeture du fichier d'appel
End If
End If
End Sub
Si dans le fichier d'appel tu inclues une liste des utilisateurs et de leurs coordonnées, tu peux retourner dans un MsgBox l'information du QUI est connecté et COMMENT le joindre.
C'est ce que j'ai fait pour une gestion Excel de fichiers des sauvegardes de programmation d'automates entretenus par 40 techniciens sans m'encombrer d'une base de données.
En espérant que ça t'aidera.
Cdt
Rataxes64