G
Grégory
Guest
Bonjour à tous,
Alors voici une question piège à propos d'un truc bizarre qui m'arrive et j'avoue être un peu dépassé. Suivez bien...
Je cherche à écrire une macro ("My_Macro") exécutable en faisant un click droit sur un groupe de cellules. Jusque là, pas de problème, j'ajoute une commande au menu PopUp et ça marche.
Seulement, je voudrait que cette commande supplémentaire n'apparaisse que si le groupe de cellules est complet, c'est à dire que dans mon cas, il doit contenir un nombre quelconque de lignes dont la première cellule est sur la première colonne et la dernière est au moins sur la 27ème colonne (plus à droite, le tableau est vide). Donc bien sûr, si on a sélectionné un groupe de lignes entières, c'est bon ! ... et en fait, c'est là que ça foire. Regardez ce que j'ai écrit :
(à placer dans ThisWorkbook)
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim CellDropDown As CommandBar
Dim MyDropDownItem As CommandBarControl
colonne1 = Selection.Column 'numéro de la première colonne de la zone sélectionnée
colonne2 = Selection.Columns(Selection.Columns.Count).Column 'numéro de la dernière colonne sélectionnée
If colonne1 = 1 And colonne2 >= 27 Then 'Ma condition. C'est ici que ça ne fonctionne pas.
RemoveFromCellDropDown 'petite macro enlevant le bouton supplémentaire s'il est toujours là. Ca fonctionne correctement. Voir plus bas.
Set CellDropDown = Application.CommandBars("Cell")
With CellDropDown.Controls.Add(Type:=msoControlButton, temporary:=True) 'Création du bouton
.Caption = "My Macro"
.Style = msoButtonIconAndCaption
.FaceId = 292
.OnAction = ThisWorkbook.Name & "!My_macro" 'Le bouton exécute My_Macro correctement
.Tag = "MyDropDownItem"
End With
End If
End Sub
Les deux macros suivantes sont à placer dans un module
Sub RemoveFromCellDropDown() 'comme expliqué plus haut, ca fonctionne.
'Utilisez cette macro avec F5 pour enlever la nouvelle commande avant de faire un essai suivant.
Dim MyDropDownItem As CommandBarControl
Set MyDropDownItem = Application.CommandBars.FindControl(Tag:="MyDropDownItem")
If Not MyDropDownItem Is Nothing Then
MyDropDownItem.Delete
End If
Set MyDropDownItem = Nothing
End Sub
Sub My_macro()
MsgBox "colonne1 = " & colonne1 & Chr(13) & _
"colonne2 = " & colonne2 & Chr(13) & _
End Sub
Alors, voici le problème : si je sélectionne un groupe de cellules répondant au critère, ça marche. Mais si je sélectionne des cellules entières, ça ne marche plus ! la condition " If colonne1 = 1 And colonne2 >= 27 Then" semble ne plus être respectée. Pourtant, si vous faites tourner la macro "My_Macro" en utilisant F5, vous obtenez par exemple ceci :
(j'ai sélectionné par exemple les lignes complètes 3 à 5)
colonne1 = 1
colonne2 = 256
Donc, en toute logique, la condition est bien remplie... pourtant ça ne fonctionne pas.
Vous y comprenez quelque chose vous ?
Si oui, dites le moi, je vous en serai infiniment reconnaissant.
A très bientôt.
Gregory
Alors voici une question piège à propos d'un truc bizarre qui m'arrive et j'avoue être un peu dépassé. Suivez bien...
Je cherche à écrire une macro ("My_Macro") exécutable en faisant un click droit sur un groupe de cellules. Jusque là, pas de problème, j'ajoute une commande au menu PopUp et ça marche.
Seulement, je voudrait que cette commande supplémentaire n'apparaisse que si le groupe de cellules est complet, c'est à dire que dans mon cas, il doit contenir un nombre quelconque de lignes dont la première cellule est sur la première colonne et la dernière est au moins sur la 27ème colonne (plus à droite, le tableau est vide). Donc bien sûr, si on a sélectionné un groupe de lignes entières, c'est bon ! ... et en fait, c'est là que ça foire. Regardez ce que j'ai écrit :
(à placer dans ThisWorkbook)
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim CellDropDown As CommandBar
Dim MyDropDownItem As CommandBarControl
colonne1 = Selection.Column 'numéro de la première colonne de la zone sélectionnée
colonne2 = Selection.Columns(Selection.Columns.Count).Column 'numéro de la dernière colonne sélectionnée
If colonne1 = 1 And colonne2 >= 27 Then 'Ma condition. C'est ici que ça ne fonctionne pas.
RemoveFromCellDropDown 'petite macro enlevant le bouton supplémentaire s'il est toujours là. Ca fonctionne correctement. Voir plus bas.
Set CellDropDown = Application.CommandBars("Cell")
With CellDropDown.Controls.Add(Type:=msoControlButton, temporary:=True) 'Création du bouton
.Caption = "My Macro"
.Style = msoButtonIconAndCaption
.FaceId = 292
.OnAction = ThisWorkbook.Name & "!My_macro" 'Le bouton exécute My_Macro correctement
.Tag = "MyDropDownItem"
End With
End If
End Sub
Les deux macros suivantes sont à placer dans un module
Sub RemoveFromCellDropDown() 'comme expliqué plus haut, ca fonctionne.
'Utilisez cette macro avec F5 pour enlever la nouvelle commande avant de faire un essai suivant.
Dim MyDropDownItem As CommandBarControl
Set MyDropDownItem = Application.CommandBars.FindControl(Tag:="MyDropDownItem")
If Not MyDropDownItem Is Nothing Then
MyDropDownItem.Delete
End If
Set MyDropDownItem = Nothing
End Sub
Sub My_macro()
MsgBox "colonne1 = " & colonne1 & Chr(13) & _
"colonne2 = " & colonne2 & Chr(13) & _
End Sub
Alors, voici le problème : si je sélectionne un groupe de cellules répondant au critère, ça marche. Mais si je sélectionne des cellules entières, ça ne marche plus ! la condition " If colonne1 = 1 And colonne2 >= 27 Then" semble ne plus être respectée. Pourtant, si vous faites tourner la macro "My_Macro" en utilisant F5, vous obtenez par exemple ceci :
(j'ai sélectionné par exemple les lignes complètes 3 à 5)
colonne1 = 1
colonne2 = 256
Donc, en toute logique, la condition est bien remplie... pourtant ça ne fonctionne pas.
Vous y comprenez quelque chose vous ?
Si oui, dites le moi, je vous en serai infiniment reconnaissant.
A très bientôt.
Gregory