IF "toute une ligne est sélectionnée"

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
 
G

Grégory

Guest
Re-bonjour,
Ma description n'est peut-être pas très claire alors voici ce qu'il faut faire pour voir comment ça fonctionne :
1. Ouvrez un fichier Excel quelconque (vide ou rempli, c'est comme on veut).
2. Copiez la première macro "Workbook_SheetBeforeRightClick" dans la section ThisWorkbook du fichier sur le navigateur VBA.
3. Créez un module associé au fichier
4. Copiez les deux macros suivantes dans le module ("RemoveFromCellDropDown" et "My_macro")
5. Sauvez puis ouvrez Excel
6. Sélectionnez un petit nombre de cellules et faites un click droit. Le menu qui apparaît est le même que d'habitude. Normal.
7. Maintenant, sélectionnez UN ensemble de cellule incluant AU MOINS une cellule dans la colonne A et une dans la colonne AA, mais PAS une ligne entière. Ensuite faites un click droit sur la zone sélectionnée.
Normalement, un nouveau bouton appelé "My Macro" avec une icône apparaît en bas du menu.
8. Cliquez sur ce menu "My Macro" et une msgbox apparaît avec les valeurs des variables colonne1 et colonne2.
9. Aller dans le navigateur VBA et placez le curseur quelque part dans la macro "RemoveFromCellDropDown" pour enlever ce nouveau bouton sinon il ne s'enlève pas tout seul.
10. Essayez en faisant un click droit sur une cellule ou deux, il a disparu. OK jusque là !
11. Maintenant, sélectionnez quelques lignes complètes.
12. Faites un click droit sur la sélection et là... rien ! pas de bouton "My Macro". Ma question est "Pourquoi ?" et comment résoudre le problème ?
13. Allez dans le navigateur VBA et placez le curseur quelque part dans la macro "My_Macro" et tapez sur F5. Oh stupéfaction, les valeurs des variables colonne1 et colonne2 sont bien 1 et 256, et le critère pour faire fonctionner la macro est donc rempli. Cherchez l'erreur...

Bon amusement et bravo à celui qui trouve !

Grégory
 
G

Grégory

Guest
Et si quelqu'un a une autre proposition à faire pour traduire la condition :

IF "une ou plusieurs ligne(s) complète(s) sont sélectionnées" Then

cela résoudrait mon problème.

Merci d'avance.

Grégory
 
G

Grégory

Guest
La solution

Merci Sylvain mais ça ne marche pas.

En fait, j'ai finalement trouvé la solution :

Set CellDropDown = Application.CommandBars("Cell")

Cette expression concerne le menu popup qui apparaît quand on fait un click droit sur une sélection d'un ensemble de cellules. Mais si la sélection est un ensemble de ligne entières, le menu popup est un autre menu légèrement différent. Par tâtonnement, j'ai trouvé qu'il s'appelle

Application.CommandBars("Row")

Donc le premier menu était bien modifié mais on ne le voyait pa puisque c'est un autre menu qui apparaissait. J'ai donc revu mon programme et voici une version qui fonctionne impeccablement. Il n'y a plus qu'à placer une macro dans My_Macro qui coupe et colle la sélection dans une autre feuille et on a un système d'archivage très pratique.

A 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
Dim colonne1, colonne2 As Integer
RemoveFromDropDown
colonne1 = Selection.Column
colonne2 = Selection.Columns(Selection.Columns.Count).Column
If colonne1 = 1 And colonne2 >= 27 And colonne2 <> 256 Then
AddToCellDropDown
ElseIf colonne1 = 1 And colonne2 = 256 Then
AddToRowDropDown
End If
End Sub

A placer dans un module :

Sub AddToCellDropDown()
Dim CellDropDown As CommandBar
Dim MyDropDownItem As CommandBarControl

Set CellDropDown = Application.CommandBars("Cell")
With CellDropDown.Controls.Add(Type:=msoControlButton, temporary:=True)
.Caption = "Archiving"
.Style = msoButtonIconAndCaption
.FaceId = 292
.OnAction = ThisWorkbook.Name & "!My_macro"
.Tag = "MyDropDownItem"
End With
End Sub

Sub AddToRowDropDown()
Dim RowDropDown As CommandBar
Dim MyDropDownItem As CommandBarControl

Set RowDropDown = Application.CommandBars("Row")
With RowDropDown.Controls.Add(Type:=msoControlButton, temporary:=True)
.Caption = "Archiving"
.Style = msoButtonIconAndCaption
.FaceId = 292
.OnAction = ThisWorkbook.Name & "!My_macro"
.Tag = "MyDropDownItem"
End With
End Sub

Sub RemoveFromDropDown()
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 "Ca marche !"
End Sub


A bientôt

Grégory
 

Discussions similaires

Réponses
2
Affichages
240

Statistiques des forums

Discussions
312 410
Messages
2 088 157
Membres
103 749
dernier inscrit
Juju34