bloquer bouton macro si classeur déjà ouvert

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

stephane.quinquis

XLDnaute Junior
Bonjour le forum,

J'ai un classeur enregistrement des pertes et un classeur inventaire production.
Mon classeur enregistrement des pertes est un formulaire qui est rempli par 9 utilisateurs différents mais chaque utilisateur a son propre formulaire.
Ma base de donnée centrale est l'inventaire production

Des données vont être transféré des différents classeurs enregistrement vers la base de données centrales inventaire production.

Afin que cela fonctionne, dans ma macro transfert de données, j'ai déjà prévu que le classeur inventaire production soit sauvegardé et refermé immédiatement après le transfert de données.

Mais je ne souhaite prendre aucun risque et ce que je veux maintenant c'est qu' au cas où le classeur inventaire production soit ouvert par une personne X alors une personne Y ne pourra pas cliquer sur le bouton et une messagebox affichera"classeur déjà ouvert" par exemple.
Ce bout de macro doit être situé avant le démarrage de ma macro transfert de données.

J'ai oublié de notifier que ces fichiers seront partagés en réseau.

enregistrement des pertes
Cijoint.fr - Service gratuit de dépôt de fichiers

Merci
 

Pièces jointes

Re : bloquer bouton macro si classeur déjà ouvert

Bonjour stephane.quinquis,

Je vois qu'il y a plusieurs boutons identiques dans votre fichier.

Je suppose que :

- ils lancent la même macro

- à chaque clic la macro ouvre le fichier inventaire production.xls , entre les données puis enregistre et ferme le fichier.

Dans ces conditions, il vous suffit de mettre en début de macro :

Code:
On Error Resume Next
If IsError(Workbooks("inventaire production.xls").Name) Then GoTo 1
MsgBox "Le fichier 'inventaire production' est indisponible"
Exit Sub
1 On Error GoTo 0

A+
 
Dernière édition:
Re : bloquer bouton macro si classeur déjà ouvert

Bonjour Job75,

Tout d'abord merci beaucoup d'avoir répondu.

En ce qui concerne la macro, elle fonctionne très bien sur un seul ordinateur. Par contre, dès qu'il s'agit de partager en réseau ces fichiers, cette gestion des erreurs ne fonctionne plus. La macro arrive à ouvrir le classeur inventaire production en lecture seule.
Je voulais savoir s'il n'y avait pas un moyen de bloquer l'accès en lecture seule également.

Merci
 
Re : bloquer bouton macro si classeur déjà ouvert

Bonjour Stéphane,

Je ne suis pas bien compétent sur les partages de classeur, mais essayez peut-être :

Code:
On Error Resume Next
If IsError(Workbooks("inventaire production.xls").Name) Then GoTo 1
[COLOR="Red"]2[/COLOR] MsgBox "Le fichier 'inventaire production' est indisponible"
Exit Sub
1 On Error GoTo 0
'mettre ici le code d'ouverture du fichier
If ActiveWorkbook.[COLOR="Red"]ReadOnly[/COLOR] Then ActiveWorkbook.Close False: GoTo 2

A+
 
Dernière édition:
Re : bloquer bouton macro si classeur déjà ouvert

Rebonjour Job 75,

Encore merci. La gestion des erreurs se fait correctement. Si j'ouvre l'inventaire production sur un autre ordinateur, il m'indique immédiatement la message box.

Par contre, l'éxécution de la macro ne se fait plus correctement. En fait, j'ai plusieurs cas où le bouton macro doit se bloquer dont un où la macro affiche "ligne déjà copiée" si la ligne est coloré en jaune.

J'ai donc trois cas où la macro ne doit pas fonctionner:
Dans l'ordre:
1-le cas où le classeur est déjà ouvert(le cas que l'on a vu ensemble)
2-le cas où il n'y a pas d'initiales dans la case D7(l'opérateur n'a pas inscrit ses initiales)
3-le cas où la ligne est coloré en jaune(ligne déjà copié)

Mon problème est qu'il doit y avoir un chevauchement entre les erreurs.
Si j'éxecute la macro dans le cas normal(classeur inventaire prod fermé, initiales bien renseigné en D7 et ligne coloré en blanc), ma macro ouvre le classeur inventaire production et la messagebox affiche"ligne déjà copié"

Avez vous une idée d'où cela peut venir????

Je vois joins les deux fichiers exemples et le code de la macro pour vous faciliter la tâche.

enregistrement des pertes
Cijoint.fr - Service gratuit de dépôt de fichiers


Code

Code:
Sub testvalidation()

On Error Resume Next
If IsError(Workbooks("inventaire production.xls").Name) Then GoTo 1
2 MsgBox "Le fichier 'inventaire production' est indisponible"
Exit Sub
1 On Error GoTo 0
Workbooks.Open "\\S110dvp02\chefeq\STAGE S QUINQUIS\maquette logiciel\inventaire production.xls"
If ActiveWorkbook.ReadOnly Then ActiveWorkbook.Close False: GoTo 2
If ActiveSheet.Range("D7") = "" Then MsgBox "Veuillez Entrer vos initiales ": Exit Sub
If ActiveSheet.Range("B7:G7").Interior.ColorIndex <> 2 Then MsgBox "Ligne déjà Copiée": Exit Sub
Workbooks.Open "\\S110dvp02\chefeq\STAGE S QUINQUIS\maquette logiciel\inventaire production.xls"
    Rows("7:7").Select
    Selection.Insert Shift:=xlDown
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    Selection.Interior.ColorIndex = 2
    Selection.Font.ColorIndex = 0
    ActiveWindow.SmallScroll ToRight:=-4
    Range("H7:EL7").Select
    With Selection.Interior
        .ColorIndex = 15
        .Pattern = xlSolid
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    End With
    Windows("Enregistrement des pertes.xls").Activate
    Range("B7").Select
    Selection.Copy
   Windows("inventaire production exemple 2.xls").Activate
    Range("C7").Select
    ActiveSheet.Paste
    Windows("enregistrement des pertes.xls").Activate
    Range("C7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("inventaire production exemple 2.xls").Activate
    Range("B7").Select
    ActiveSheet.Paste
    Windows("enregistrement des pertes.xls").Activate
    Range("D7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("inventaire production exemple 2.xls").Activate
    Range("E7").Select
    ActiveSheet.Paste
    Windows("enregistrement des pertes.xls").Activate
    Range("E7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("inventaire production exemple 2.xls").Activate
    Range("D7").Select
    ActiveSheet.Paste
    Windows("enregistrement des pertes.xls").Activate
    Range("F7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("inventaire production exemple 2.xls").Activate
    Range("F7").Select
   Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Windows("enregistrement des pertes.xls").Activate
    Range("G7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("inventaire production exemple 2.xls").Activate
    Range("G7").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Application.CutCopyMode = False
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWindow.SmallScroll ToRight:=-7
    Range("B7:G7").Select
    Selection.Interior.ColorIndex = 6

End Sub
Merci
 

Pièces jointes

Re : bloquer bouton macro si classeur déjà ouvert

Re,

Mon problème est qu'il doit y avoir un chevauchement entre les erreurs.

Il n'y a plus d'erreurs après le GoTo 0...

Par contre votre code est à corriger : les lignes en rouge ouvrent 2 fois le fichier, et les tests sont mal placés.

Donc remplacer :

Code:
1 On Error GoTo 0
[COLOR="Red"]Workbooks.Open "\\S110dvp02\chefeq\STAGE S QUINQUIS\maquette logiciel\inventaire production.xls"[/COLOR]
If ActiveWorkbook.ReadOnly Then ActiveWorkbook.Close False: GoTo 2
If ActiveSheet.Range("D7") = "" Then MsgBox "Veuillez Entrer vos initiales ": Exit Sub
If ActiveSheet.Range("B7:G7").Interior.ColorIndex <> 2 Then MsgBox "Ligne déjà Copiée": Exit Sub
[COLOR="red"]Workbooks.Open "\\S110dvp02\chefeq\STAGE S QUINQUIS\maquette logiciel\inventaire production.xls"[/COLOR]
    Rows("7:7").Select

par :

Code:
1 On Error GoTo 0
If ActiveSheet.Range("D7") = "" Then MsgBox "Veuillez Entrer vos initiales ": Exit Sub
If ActiveSheet.Range("B7:G7").Interior.ColorIndex <> 2 Then MsgBox "Ligne déjà Copiée": Exit Sub
Workbooks.Open "\\S110dvp02\chefeq\STAGE S QUINQUIS\maquette logiciel\inventaire production.xls"
If ActiveWorkbook.ReadOnly Then ActiveWorkbook.Close False: GoTo 2
    Rows("7:7").Select

Nota : et puis travaillez un peu VBA pour éviter tous ces Select qui ne servent à rien, on se tue à le répéter sur ce forum 🙄

A+
 
Re : bloquer bouton macro si classeur déjà ouvert

Rebonjour Job75,

Désolé pour les Select. Je suis nouveau en VBA et j'essaie de comprendre comment cela fonctionne.
Concernant la macro, elle fonctionne mais le gestionnaire d'erreurs plante dans deux cas:
1)si un opérateur ne rentre pas ses initiales, la message box "veuillez entrer vos initiales" s'affiche. Jusqu'ici pas de problème. Par contre si l'opérateur rentre ses initiales après l'affichage de cette messagebox et valide, la messagebox réapparaît alors que je voudrais qu'il transfert cette information
2) Si un opérateur valide une ligne qui est affiché en jaune, la messagebox "ligne déjà copiée" doit s'afficher or ici la validation se fait correctement et ma ligne est copié en jaune dans mon autre fichier

Merci

Enregistrement des pertes
Cijoint.fr - Service gratuit de dépôt de fichiers
 
Re : bloquer bouton macro si classeur déjà ouvert

Bonjour,

J'utilise le même procédé avec plus de 20 utilisateurs sur plusieurs sites pour un planning de réception.
Je contourne les effets d'accès simultané avec cette petite routine dans une fonction :

Function Acces_Base(Ma_Base_de_données_en_ligne As String) As Boolean

Dim A As Integer, filenum As Integer, errnum As Integer, Chemin As String

A = 1
Ecriture:
On Error Resume Next
filenum = FreeFile()

Open "Ma_Base_de_données_en_ligne" For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
Acces_Base = True
Workbooks.Open "Ma_Base_de_données_en_ligne"
Case Else
MsgBox "Le fichier source est actuellement occupé après " & A & " tentative (" & (3 - A) & " restantes)", vbInformation, "Base occupée"
Application.Wait (Now + TimeValue("0:00:03"))
A = A + 1
If A < 4 Then
GoTo Ecriture
Else
MsgBox "Le fichier source est actuellement occupé après 3 tentatives" & Chr(10) & Chr(13) & "Merci de rééssayer ultérieurement", vbCritical, "Base occupée"
Acces_Base = False
End If
End Select
End function
 
Dernière édition:
Re : bloquer bouton macro si classeur déjà ouvert

Re Stéphane,

Les problèmes que vous soulevez n'ont plus rien à voir avec ce fil "bloquer bouton macro si classeur déjà ouvert".

A mon avis votre macro de tranfert n'est pas au point, et elle n'a jamais dû marcher, n'est-ce pas ?

Cernez bien d'où viennent les problèmes et éventuellement ouvrez d'autres discussions.

A+
 
Re : bloquer bouton macro si classeur déjà ouvert

Le truc n'est pas de bloquer le bouton d'écriture de la macro mais de faire attendre l'ouverture du fichier de 3 secondes avant de retenter.

Evidemment, il faut que les fonctions de lecture de la base de données et d'écritures soient au point...

J'en profite aussi pour préciser que le fichier qui contient les macros est en lecture seule sur le réseau et donc que 20 utilisateurs peuvent ouvrir le même fichier qui pilote la base de données en ligne. Et que personne n'ouvre directement cette base de données.
 
Dernière édition:
Re : bloquer bouton macro si classeur déjà ouvert

Rebonjour Job75, bonjour Ubot303

Je vais suivre les conseils de Job75 et essayer de cerner d'où vient le problème. Ma macro de transfert a déjà fonctionner mais je vais reprendre un par un la gestion des erreurs et voir ce qui me fait planter.
Merci à Ubot303 mais ma base n'est pas sur access mais sur excel.
 
Re : bloquer bouton macro si classeur déjà ouvert

La mienne aussi.
C'est la fonction que j'ai nommé Acces_Base (du verbe Accéder) et non pas Access_Base...

Le mieux est de ne pas trop lire en diagonale, car j'ai rencontré les 2 mêmes problématiques (multi accès et mise à jour d'une base en ligne) et j'ai posté les solutions trouvées.
 
Re : bloquer bouton macro si classeur déjà ouvert

Bonjour Ubot303,

Comme je l'ai dit, je ne suis pas expert en classeurs partagés.

Mais tout ce qui a été fait dans les posts précédents vise à ce que le fichier partagé ne soit ouvert et traité que par un seul utilisateur à la fois 😉

Par ailleurs la macro qui traite les données n'est pas du tout dans le classeur partagé, c'est évident.

Vous n'êtes pas d'accord ?

A+
 
Re : bloquer bouton macro si classeur déjà ouvert

Rebonjour à vous deux,

Je suis vraiment con. En fait je m'étais embrouillé dans la nomination de certaines cellules donc logique que ça marche pas.......
Merci beaucoup Job75, ta solution fonctionne très bien.
Quant à Ubot 303, je testerai ta solution d'ici lundi pour voir si elle fonctionne.
Merci à vous deux et bon week end!!!
 
Re : bloquer bouton macro si classeur déjà ouvert

Je suis d'accord, job75.

Le fichier qui contient les données (appelons le "La Base") n'est ouvert que par une source en même temps.
Le principe appliqué est que les utilisateurs passent par un autre fichier (appelons le "Portail") qui ne contient aucune donnée mais les macros de lecture/ecriture de "La Base".
Ainsi aucun utilisateur n'accède en direct à "La Base" mais les macros se chargent d'ouvrir, de rapatrier ou d'ajouter des données, de sauvegarder ou non "La Base", et de la refermer.
Au final, "La Base" ne reste ouverte que qq millisecondes voire qq secondes (en fonction des traitements effectués) pour être à nouveau disponible pour un autre traitement provenenant du même ou d'un autre utilisateur.

Il arrive cependant qu'un 2eme processus veuille accéder à "La Base" alors que celle-ci est occupée.
Il s'agit donc de faire patienter qq secondes la 2ème demande, le temps que le premier traitement soit achevé et donc La Base refermée et donc à nouveau disponible 🙂

Le petit "plus" est que le Portail qui contient les macros peut être placé sur le réseau en Lecture-Seule. Ainsi tous les opérateurs peuvent l'ouvrir sur des PC différents car de toutes façons les données ne sont pas sur le Portail et que celui-ci se referme sans jamais enregistrer aucune modification 😉
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
754
Réponses
3
Affichages
951
Retour