Activer une liste de validation sur un clic droit
#1
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 05-06-2012 16h38
Bonjour à tous,
Dans un fichier, j'utilise déjà une macro évènementielle du style worksheet_change sur une colonne mais je suis bloqué car j'aimerais bien en utilisé une autre sur une autre colonne.
Donc j'avais pensé à worksheet_BeforeRightClick mais la colonne contient une liste de validation et ma question est : peut-on déclencher cette liste par évènement du clic droit ?

Merci d'avance et bonne fin de journée.
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#2
Accro XLPages

Inscription: 23/05/2008
De La Varenne Saint-Hilaire

Messages: 356

Système d'exploitation:
PC
Version Excel utilisée:
2010
Posté le : 05-06-2012 18h01
Bonsoir criscris11,

Si j'ai bien compris, tu dois pouvoir gérer l'ensemble dans ta macro évènementielle sans avoir besoin du clic droit, en détectant l'adresse de la cellule qui est modifiée.
Par exemple:
Private Sub Worksheet_Change(ByVal Target As Range)
'Evènement colonne B
If Not Intersect(Target, Columns(2)) Is Nothing Then
    'Le code
End If

'La liste de validation est en cellule E1
If Target.Address = "$E$1" Then
    'Le code
End If
End Sub
 

Vois si cette piste peut t'aider,

Bonne soirée,

mth
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#3
Accro XLPages

Inscription: 09/05/2007
De Courcelles-les-Montbéliard

Messages: 286

Système d'exploitation:
PC & Mac
Version Excel utilisée:
Mac 2004 - 2011, et PC 2003 - 2010
Posté le : 05-06-2012 18h13
Bonjour Mireille, criscris11, Didier, le Forum

Je complète la réponse de Mireille, et je suis du même avis, tu peux en contrôlant l'adresse de la cellule sélectionnée, activer différent bloc d'instructions, tout en gardant le même événement.

J'ai rajouté l'ouverture automatique de la liste de validation quand on sélectionne une cellule en disposant.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim TestListe As Byte
    Select Case Target.Column
        Case 2 'L'utilisateur à sélectionner une cellule de la colonne B
            MsgBox "Bonjour"
        Case 6 'L'utilisateur à sélectionner une cellule de la colonne F
            'On vérifie qu'une seule cellule est sélectionnée
            If Target.Cells.Count = 1 Then
                'Contrôle de la présence d'une liste de validation
                'Si une cellule ne dispose pas d'un object "validation"
                'cela va provoquer une erreur VBA, que je neutralise par la ligne ci-dessous
                On Error Resume Next
                TestListe = Target.Validation.Type
                'l'option "Liste" de l'objet Validation a la valeur 3
                If TestListe = 3 Then
                    'Ouverture de la liste de validation par la méthode SendKeys
                    Application.SendKeys "%{DOWN}"
                End If
            End If
    End Select
End Sub
  

Si Didier passe par là, j'espère qu'il corrigera mes erreurs.

Si l'utilisateur clic sur une cellule avec le clic droit, l'événement Worksheet_BeforeRightClick est retourné. C'est donc possible. Mais attention normalement, le clic droit sert en principe à l'affichage d'un menu contextuel, donc tu vas devoir gérer les concéquences du détournement de l'action de l'utilisateur...


@+Jean-Marie



Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#4
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 05-06-2012 20h37
Bonsoir Mireille, Jean-Marie, Didier, le forum,
Merci à Mireille et à Jean-marie pour leurs pistes qui se recoupent et qui m'arrangeraient bien c'est sûr car jusqu'à présent je n'avais trouvé que la solution du clic droit pour me sortir de mon bourbier.
Je vais essayer de m'en sortir avec ces codes en attendant la confirmation ou la correction de la part de Didier s'il le juge nécessaire bien évidemment.
En attendant un grand merci et bonne soirée.

PS : Si je m'en sors pas avant demain soir, je posterais les deux codes actuels qu'il faudra essayer de fusionner.
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#5
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 05-06-2012 22h00
Bonsoir criscris11, Mth, JeanMarie, le Forum,

A vrai dire, moi, je n'ai pas compris l'exacte objectif de ta question criscris11

Cela dit, puisque tu m'y invites JeanMarie , je viens de jeter un oeil sur ton code (et plus qu'un oeil puisque j'ai testé ) et j'en fais une analyse critique que je souhaite bien évidemment positive.

Tout d'abord, une remarque : j'ai testé sur XL2010, puis sur XL2003. Et si j'ai testé sur les deux ce n'est bien évidemment pas par hasard car j'avais un doute... Il me semblait avoir déjà rencontré des choses bizarres avec les sendkeys notamment...

L'instinct m'a donné raison, car ça ne fonctionne pas sous mon XL2003 !

Un quart d'heure de prise de cerveau plus tard, je me rends compte qu'il suffit simplement de supprimer le "Application." dans :
Application.SendKeys "%{DOWN}"
... pour que tout se mette en place correctement sur les 2 versions Excel cette foi !

Bien sûr JeanMarie, tu vas me dire : "Quoi ? C'est quoi ce binz ?"... et tu auras raison

Visiblement, la méthode SendKeys (liée à l'objet Application) est fautive. Et si tu enlèves donc "Application.", alors le système n'utilise plus la méthode SendKeys issue de la bibliothèque Excel / Classe Application, mais l'instruction SendKeys issue directement de la bibliothèque VBA (qui elle, solutionne le problème)!

Alors bien sûr, mon explication est lourding à souhait... mais voir l'Explorateur d'objets (touche F2 depuis l'éditeur VBE) et faire une recherche sur le mot clé "SendKeys" pour constater la même chose que moi et se rendre compte de ce que j'écris.

Evidemment, il est inutile de me demander pourquoi il existe 2 SendKeys (comme il existe aussi 2 InputBox avec chacune leur spécificité) et quelle est la philosophie adoptée par Microsoft sur ce point... Je n'en sais strictement rien, mais c'est comme ça !

Et là, JeanMarie, tu vas me dire : "Quoi ? Ils sont fous chez Microsoft !"... et tu auras encore raison

Concernant la procédure proprement dite, je ne vais parler que d'optimisation puisque ta procédure fonctionne très bien JeanMarie . J'en profite d'ailleurs au passage pour féliciter encore les gens comme toi et Mth qui ont une grande expertise des Formules, TCD et autres bonnes choses, tout en manipulant VBA de façon fort honorable ! Bravo, je le dis et je le répète, mon champ d'investigation à moi est bien plus restreint.

J'aborde donc les détails de ta procédure JeanMarie :

Tout d'abord, l'évènement "Worksheet_SelectionChange()" est un évènement très sensible car il se déclenche à chaque changement de sélection par l'utilisateur (par le code aussi !). Il convient donc de rester très vigilant et très light sur ce type de procédure évènementielle...

Dans cette partie :
TestListe = Target.Validation.Type
If TestListe = 3 Then
 
Là, je pense que l'utilisation d'une variable n'est peut être pas indispensable puisque tu ne vas te servir de cette variable qu'une seule fois dans tout le code. 
Pour ma part, j'aurai fait directement :
If Target.Validation.Type = 3 Then
(et j'économisais donc au passage le Dim correspondant en tête de procédure)

Ensuite, comme tu fais usage d'un "On Error Resume Next", alors je pense que le test :
If Target.Cells.Count = 1 Then
...ne devient plus essentiel. Que la sélection soit d'une cellule ou de plusieurs, le "On error" nous sauve de toutes façons et le test "IF" en amont n'est plus très utile à mon avis.
J'ai dans l'idée qu'il faut toujours éviter les tests "IF" quand c'est possible afin d'économiser un maximum de temps machine.
L'utilisation du "Select Case" est par contre une très bonne idée, car réputée comme étant peu gourmande et bien plus performante que des "IF" successifs.

Et dernière chose, je m'aperçois que si je réduis ton code uniquement à ça :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Select Case Target.Column
        Case 2 'L'utilisateur à sélectionner une cellule de la colonne B
            MsgBox "Bonjour"
        Case 6 'L'utilisateur à sélectionner une cellule de la colonne F
            SendKeys "%{DOWN}"
    End Select
End Sub
... eh bien, tout semble fonctionner !
Il reste juste un petit effet peu esthétique lorsque tu cliques sur une cellule de la colonne F qui n'aurait pas de liste de validation : un semblant de liste se déroule quand même... Mais nous ne subissons aucun plantage, ni aucun effet pervers !

Voilà, ce que j'ai pu décortiquer de cet extrait de code. Mais, je le répète à nouveau : tout ça n'est que chipotage et ta procédure était tout à fait fonctionnelle JeanMarie !

Cordialement,




Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#6
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 05-06-2012 22h50
Re à tous,

Voici mes deux codes :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Count = 1 Then
    If Target.Value <> "" Then
      Transfert = Target
      If Transfert <> ActiveSheet.Name Then
        Application.EnableEvents = False
        Target.Resize(1, 69).Copy Sheets(Transfert).[A65000].End(xlUp).Offset(1, 0)
        Target.Resize(1, 69).Delete shift:=xlUp
        Application.EnableEvents = True
      End If
    End If
  End If
End Sub
Le premier permet de déplacer la ligne sélectionnée dans un autre onglet quand on clique en colonne A (sauf sur les 2 lignes d'entêtes).

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 5 And Target.Count = 1 And Target.Row > 2 Then
ActiveCell.Offset(0,18).Select
MsgBox "En cas de changement de grade, ne pas oublier de changer la date.", vbCritical, "Attention..."
End If
End Sub
quand au deuxième, le curseur va se positionner dans la colonne où la nouvelle date doit être saisie en cas de changement de valeur dans la cellule sélectionnée.

Donc si j'ai bien compris :
Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Column
        Case 1 'L'utilisateur à sélectionner une cellule de la colonne A
            Mon premier code
        Case 5 'L'utilisateur à sélectionner une cellule de la colonne E
            SendKeys "%{DOWN}"
    End Select
End Sub
Reste juste une question : peut-on juste délimiter les Case pour ne pas agir sur les 2 lignes d'entêtes ?
Merci encore pour vos réponses et bonne soirée à tous.

Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#7
Accro XLPages

Inscription: 09/05/2007
De Courcelles-les-Montbéliard

Messages: 286

Système d'exploitation:
PC & Mac
Version Excel utilisée:
Mac 2004 - 2011, et PC 2003 - 2010
Posté le : 05-06-2012 22h55
Bonsoir

Merci Didier, pour ton examen de mon code, il est toujours bon de connaître ton avis.

Concernant le code pur, je l'ai codé sous office 2003 sp3, et je n'ai pas remarqué le problème du sendkeys, il fonctionne de mon côté aussi bien avec Application que sans.

J'ai rajouté le test 
If Target.Validation.Type = 3 Then
    SendKeys "%{DOWN}"
End If
en voyant cette effet d'ouverture d'une liste de validation vide, quand la cellule n'en contient pas.

Mais ce test provoque un plantage de l'exécution du code quand la cellule ne contient pas de liste de validation, j'ai donc rajouté la ligne
On Error Resume Next
pour continuer le déroulement du code, mais en laissant le test en l'état le bloc d'instructions du IF est quand même exécuté, j'ai donc mis une état intermédiaire en donnant le valeur à tester dans une variable, Y a-t-il un autre moyen ?

Jean-Marie


 
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#8
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 05-06-2012 23h48
Re JeanMarie,

Tu as tout à fait raison JeanMarie !!!

Je n'ai visiblement pas assez réfléchi à ce cas de figure . Comme quoi, les choses ne sont jamais acquises.

Il y a d'autres façons de faire, mais après tests et réflexion, ta façon de faire me semble au final le meilleur compromis ! Trop fort JeanMarie


Tu peux toutefois te passer du test "If Target.Cells.Count = 1 Then" je pense (je n'ose plus dire que je suis sûr lol )

Concernant le problème que je rencontre avec XL2003 (SP3 pour moi également), je n'ai pas idée de ce qui arrive chez moi... (peut-être une incompatibilité dû à une macro complémentaire, je ne vois que ça...)

@+

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Activer une liste de validation sur un clic droit
#9
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 06-06-2012 20h25
Bonsoir Mireille, Jean-Marie, Didier, le forum,
Grâce à vous trois, non seulement vous avez résolu mon problème (oui, je sais je n'oublie pas la balise ) et en plus je m'endormirais moins bête ce soir car effectivement j'avais déjà vu la méthode Case mais je ne pensais pas qu'elle pouvait être utilisée dans une macro évènementielle et encore moins sur plusieurs colonnes (ou lignes ou ce qu'on veut...).
Donc pour résumé, plus besoin de clic droit pour sélectionner une valeur dans ma liste de validation .
 
Comme d'habitude et comme j'ai posté mes 2 codes hier soir, je vous met la macro unique que j'ai réussi (enfin j'espère) à compiler :

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Column
        Case 1 'L'utilisateur a changé la valeur d'une cellule de la colonne A
            If Target.Count = 1 And Target.Row > 2 Then
            If Target.Value <> "" Then
      Transfert = Target
      If Transfert <> ActiveSheet.Name Then
        Application.EnableEvents = False
        Target.Resize(1, 69).Copy Sheets(Transfert).[A65000].End(xlUp).Offset(1, 0)
        Target.Resize(1, 69).Delete Shift:=xlUp
        Application.EnableEvents = True
      End If
    End If
  End If
        Case 5 'L'utilisateur a changé la valeur d'une cellule de la colonne E
           If Target.Count = 1 And Target.Row > 2 Then
           ActiveCell.Offset(0, 18).Select
           MsgBox "Ne pas oublier de saisir la date de promotion.", vbCritical, "Attention..."
           End If
    End Select
    Calculate
End Sub
 
J'ai testé et cela ma semblé bien fonctionner enfin cela produit l'effet désiré sur mes 2 colonnes. Merci de bien vouloir corriger mes erreurs le cas échéant.

Bonne soirée à tous et encore un très grand merci.
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes