Bonjour à tous,

Tout d'abord désolé pour le titre du poste, mais je n'ai pas trouvé de titre plus explicite.

Le contexte est le suivant :
Je cherche à mettre un bouton "actions" sur les feuilles d'un classeur, au clic sur ce bouton, un pop-up s'ouvre et offre plusieurs actions possibles.
Mes feuilles sont en fait des fiches à remplir et les actions possible sont : Valider, Modifier, Imprimer, Supprimer, ...

Mon problème :
Une action en particulière fait passer l'application Excel dans un "drôle d'état" (la encore je ne trouve pas d'autres mots).
L'action en question est : Supprimer (son but est tout simplement de supprimer la feuille).

Je vous décris brièvement le "drôle d'état" :
  • La croix "fermer le classeur" est inopérante de même que celle "fermer l'application"
  • La navigation dans le ruban est possible mais aucun bouton ne fonctionne
  • Les autres contrôles du ruban font planter Excel
  • La navigation dans la feuille (sélection de cellules) fonction à la souris mais plante si faite via le clavier (ex : Ctrl + Fin)
  • Pleins d'autres choses étranges




J'ai minimisé le code en ne laissant que la création de la commandBar et du bouton Supprimer pour pouvoir vous le présenter.
Voici le code :

Création, suppression et alimentation de la Pop-up :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Const CmdBarName = "Menu Actions"
 
Private Sub DeleteCommandBar()
    On Error Resume Next
        Application.CommandBars(CmdBarName).Delete
End Sub
 
Private Sub CreateCommandBar()
    Dim objCommandBar As CommandBar
        Set objCommandBar = Application.CommandBars.Add(CmdBarName, msoBarPopup, False, True)
            Call AjouterBouton("Supprimer", 1088, "Supprimer", objCommandBar, True)
fin:
    Set objCommandBar = Nothing
End Sub
 
Private Sub AjouterBouton(ButtonName As String, ButtonFace As Long, ButtonOnAction As String, ByRef objCommandBar As CommandBar, bEnab As Boolean)
    With objCommandBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
        .Caption = ButtonName
        .FaceId = ButtonFace
        .OnAction = ButtonOnAction
        .Enabled = bEnab
    End With
End Sub
Le code de l'action Supprimer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Supprimer(): Call SupprimerFiche(ActiveSheet): End Sub
 
Sub SupprimerFiche(ByRef objWorksheet As Worksheet)
    Dim sPrompt$
        sPrompt = "Message de confirmation"
        Select Case MsgBox(Prompt:=sPrompt, Buttons:=vbExclamation + vbYesNo, Title:="Supprimer fiche pédagogique")
            Case vbYes
                Application.DisplayAlerts = False
                    objWorksheet.Delete
                Application.DisplayAlerts = True
            Case Else
                'Rien
        End Select
End Sub
Et enfin, la macro associée à mon bouton Actions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Sub ShowPopUp()
    Call DeleteCommandBar
    Call CreateCommandBar
    Application.CommandBars(CmdBarName).ShowPopUp
End Sub
Je supprime le pop-up pour la recréer à chaque clic car le pop-up est en fait dynamique (Nombre de bouton et propriété Enabled des boutons). Notamment en fonction de l'utilisateur sur le fichier et du contenue de la fiche.
Le code fonctionne lorsqu'il est lancé depuis l'éditeur VBA. Mais provoque ce drôle d'état lorsqu'il l'est depuis le pop-up.

J'ai trouvé deux solutions pour sortir de cet état :
  1. Changer de feuille et prendre le focus sur un Shape (les Shapes de la feuille active après suppression sont eux aussi inopérants)
  2. Ajouter une feuille et la supprimer

Les deux solutions ne fonctionnent que manuellement.




Avez-vous des idées sur ce qui provoque cet état ? Des Solutions ?
S'il vous prend l'envie de tester le code, il vous suffit de copier les 3 morceaux de codes dans un module, de créer plusieurs feuilles et d'y ajouter un bouton en lui associant la macro ShowPopUp.

Merci d'avoir pris le temps de me lire et merci d'avance pour vos réponses.