Bloquer les boutons dans une feuille de calcul
Bonjour,
Lorsque l'on créé des boutons (contrôles de formulaire) dans une feuille de calcul, pour exécuter différentes macros; il est préférable d'inhiber ceux-ci pendant l'exécution du code, pour éviter le lancement d'une autre macro (voire la même).
Il en va de même pour les boutons des Userforms et du ruban (si ruban perso).
Pour cela, il existe plusieurs méthodes :
- On peut les rendre invisibles (Visible=False),
- Les désactiver (Enabled=False),
- Rediriger le "Click bouton",
- Utiliser une méthode plus globale (voir en fin de post).
Puis on rétablit l'état initial en fin de traitement.
Rediriger le "Click bouton"
Pour les contrôles de formulaire (placés sur une feuille de calcul) on redirige le click bouton vers une macro qui ne fait rien
Voici comment :
Dans la Feuil1 du classeur nous insérons 2 boutons (contrôles de formulaires)
- Texte du 1er bouton = "Procédure A" , Affecter une macro = Proc_Bouton1
- Texte du 2ème bouton ="Procédure B", Affecter une macro = Proc_Bouton2
- Dans le volet de sélection (Format de la forme >> Volet), on renomme les boutons = "Bt_Proc_A" et "Bt_Proc_B"
Dans le module standard on place les procédures suivantes
Sub Proc_Bouton1()
' Clique sur le bouton "Procédure A" dans la Feuil1
Call Boutons(False) ' Bloque tous les boutons de la feuil1
' ... Traitement
Call Boutons(True) ' Débloque les boutons
End Sub
Sub Proc_Bouton2()
' Clique sur le bouton "Procédure B" la Feuil1
Call Boutons(False) ' Bloque tous les boutons de la feuil1
' ... Traitement
Call Boutons(True) ' Débloque les boutons
End Sub
Sub Boutons(Etat As Boolean)
' Bloque ou débloque les boutons de la feuil1 en modifiant le nom de la macro (redirection)
' Etat = True débloque ou False bloque
On Error Resume Next ' Err si modifiés ou absents
With Sheets(1)
If Etat = False Then
.Shapes("Bt_Proc_A").OnAction = "No_Macro"
.Shapes("Bt_Proc_B").OnAction = "No_Macro"
Else
.Shapes("Bt_Proc_A").OnAction = "Proc_Bouton1"
.Shapes("Bt_Proc_B").OnAction = "Proc_Bouton2"
End If
End With
On Error GoTo 0
End Sub
Sub No_Macro()
' Redirection de macro si boutons bloqués
' Rien à écrire
End Sub
Sub Rétablir_Boutons()
' Procédure de remise à true
' A utiliser si les boutons restent bloqués (suite à bug, arrêt, etc.)
' Peut être placée dans Thisworkbook Workbook_Open()
Call Boutons(True)
End Sub
Lorsque l'utilisateur clique sur un des boutons, la procédure correspondante est lancée. Les clicks boutons sont redirigés vers la macro "No_Macro".
Les boutons restent visibles mais tant que le traitement n'est pas terminé, un nouveau click lancera la macro "No_Macro" qui ne fait rien.
L'exécution se poursuivra et en fin de traitement les boutons seront réaffectés aux bonnes macros.
Si un problème survient (bug, arrêt, etc.) les boutons risquent de rester bloquer. La petite macro "Rétablir_Boutons" remettra tout en ordre.
Elle peut être exécutée à l'ouverture du classeur (Thisworkbook Workbook_Open()) ou exécutée manuellement.
On peut également utiliser cette méthode pour changer la macro affectée à un bouton en fonction d'une situation particulière :
If Test = 1 Then
Sheets(1).Shapes("Bt_Proc_A").OnAction = "Macro 1"
Else
Sheets(1).Shapes("Bt_Proc_A").OnAction = "Macro 2"
End If
Méthode plus globale
Cette méthode, plus simple, interdira l'exécution d'une macro tant qu'une autre sera en cours.
Il suffit de définir une variable globale (public) qui sera testée à chaque lancement de macro.
Public Process As Boolean ' Pointeur pour traitement en cours
' False par défaut. Si True interdit l'usage du ruban (boutons macro)
' ou le lancement d'autres macros
Dans chaque macro, on teste l'état de la variable Process.
- Si = True, un traitement est en cours, on sort.
- Si = False, on la passe à True, et on exécute le traitement. On la repasse à False en sortie
Comme ceci :
Sub Machin()
If Not Process Then ' Si =False exécute sinon sort
Process = True ' Bloque les autres processus
' Traitement
' ...
' Fin de traitement
Process = False ' Débloque
End If
End Sub
Cependant, pour les boutons placés dans un Userform, la méthode Enabled restera la plus pratique. En effet, il faudrait tester la variable "Process" dans chaque procédure évènementielle du formulaire (click, dblclick , keydown, etc.).
A vous de choisir la méthode la plus adaptée.
Bonne journée
Eric
Bonjour Eric,
Et merci pour ces informations et ce code
Bon week-end