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 j'ai déplacé le sujet, plus à sa place ici

Bon week-end

Rechercher des sujets similaires à "bloquer boutons feuille calcul"