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 :
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
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
Et enfin, la macro associée à mon bouton Actions :
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
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.
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
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 :
- Changer de feuille et prendre le focus sur un Shape (les Shapes de la feuille active après suppression sont eux aussi inopérants)
- 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.
Partager