Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA, Comment éviter qu'une macro accède a un fichier déjà ouvert

3 réponses
Avatar
Emile63
Bonjour =E0 tous,
J'ai un mod=E8le de classeur de type formulaire(xltm), qui au moment de sa =
fermeture (BeforeClose), enregistre un certain nombre de donn=E9es contenue=
s dans ces cellules dans un autre classeur sous forme de base de donn=E9es =
afin de garder un historique.
Malheureusement, travaillant =E0 plusieurs personnes sur ce mod=E8le, il ar=
rive que l'on acc=E8de simultan=E9ment au classeur d'historique, du coup le=
s donn=E9es du dernier qui essaie d'y acc=E9der ne son pas enregistr=E9es c=
ar d=E9j=E0 ouvert.=20
Je souhaiterais donc ajouter un petit controle qui diff=E8re l'ouverture de=
quelques secondes (5) par un timer le cas =E9ch=E9ant, ou si le classeur e=
st toujours inaccessible apr=E8s ce d=E9lai, un message qui indique un prob=
l=E8me d'acc=E8s et la fermeture de la proc. en cours.

Ci dessous la partie en question de ma proc=E9dure:

'... Proc=E9dure......
Set Wk =3D Workbooks.Open(R=E9pertoire & "\" & Fichier)

'
' Ici, je souhaiterais mettre un contr=F4le au cas ou le classeur en questi=
on soit d=E9j=E0 ouvert
' par un timer de 5 secondes, et si toujours ouvert, un message d'alerte en=
fin de la proc=E9dure.=20
'

MonLien =3D CStr(Tableau_Donn=E9es(18))
With Wk
With .Worksheets(Feuille)
DerLig =3D .Range("A" & .Rows.Count).End(xlUp).Row + 1
.Range("A" & DerLig) =3D CDate(Tableau_Donn=E9es(13)) 'Date
.Range("B" & DerLig) =3D CStr(Tableau_Donn=E9es(9)) ' Test
.Range("C" & DerLig) =3D CStr(Tableau_Donn=E9es(10)) ' Essai
.Hyperlinks.Add Anchor:=3DActiveSheet.Range("R" & DerLig), Addr=
ess:=3DMonLien, TextToDisplay:=3DMonLien, ScreenTip:=3D"Ouvrir fichier"
End With

'.... Suite de la proc..........

En vous remerciant d'avance pour votre aide et conseils,
Cordialement
Emile

3 réponses

Avatar
MichD
Bonjour,

Une procédure qui parut sur ce site il y a for longtemps!


----------Début de copie----------

Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum (encore merci à El-Joker, Frédéric
Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à faire
çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateurs, j'ai créé une interface d'ouverture (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas) sinon
il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)
'--------------------------------------------------------
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function
'--------------------------------------------------------
Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub
'--------------------------------------------------------
Avatar
Patrick
Archiviste en plus :)

Super de garder ces anciens codes :)

P.

Le 24-02-16 14:19, MichD a écrit :

Bonjour,

Une procédure qui parut sur ce site il y a for longtemps!


----------Début de copie----------

Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum (encore merci à El-Joker, Frédéric
Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à
faire
çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateurs, j'ai créé une interface d'ouverture (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas) sinon
il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)
'--------------------------------------------------------
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function
'--------------------------------------------------------
Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub
'--------------------------------------------------------
Avatar
Patrick
Archiviste en plus :)

Super de garder ces anciens codes :)

P.


Le 24-02-16 14:19, MichD a écrit :

Bonjour,

Une procédure qui parut sur ce site il y a for longtemps!


----------Début de copie----------

Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum (encore merci à El-Joker, Frédéric
Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à
faire
çà...