Exécuter une macro en fonction d'un choix dans une liste déroulante

Gladou

XLDnaute Nouveau
Bonsoir ☺️!

J'essaye toujours de résoudre mes problèmes avec de nombreuses recherches et applications mais cette fois-ci je donne ma langue au chat . Ou au forum aha!

J'ai réussi de nombreuses étapes seule mais là, ça fait plusieurs heures que je bloque sur une certaine étape. J'ai pourtant trouvé un fil de discussion similaire sur ce forum mais visiblement le code ne fonctionne pas pour moi... Je ne suis pas experte en Excel et je commence à peine à m'intéresser au code alors il doit y avoir une notion qui m'échappe...

Comme je l'ai dis dans mon titre, j'ai créé une liste déroulante ainsi que mes macros.

Pour l'instant le seule code qui a marché :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3")) Is Nothing Then
Call OI
End If
End Sub


Le problème c'est que du coups, tout les items de ma liste déroulante prennent la forme de ma macro OI.
J'ai vue ce code la sur une autre discussion (que j'ai transposé) :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("B3").Address Then
Select Case Target.Value
Case Is = "7:15": OI
Case Is = "7:45": OS
End Select
End If
End Sub


Mais bien sûr, cela ne marche pas... Et je ne comprend pas pourquoi. J'ai essayé beaucoup de code trouvé sur internet mais rien n'y fait . Une idée?

Merci beaucoup pour le temps et l'attention envers mon message !
 

Gladou

XLDnaute Nouveau
Merci ☺️!

J'ai fais un fichier test mais j'ai peur qu'à l'écrit ce soit compliqué d'expliquer ... Je me lance tout de même, n'hésitez pas à me dire si cela n'est pas claire! Si vous ouvrez mon fichier, vous avez donc une ligne avec le nom d'une personne (ici Dupont) et les 7 jours de la semaine. Par exemple, la case B3 correspond à l'heure et au poste effectuer le matin (7H15 I) et la case B4 pour l'après-midi. Par nécessité de précision, j'ai du créer un format d'affichage : je rentre dans la case B3 7:15 mais en affichage cela correspond à 7H15 I. De même lorsque j'écris 7:45, je demande un affichage sous la forme 7H45 S. De cette façon la case m'affiche les précisions que je veux mais elle sait que c'est une horaire, donc je peux par la suite faire des sommes etc.

Je pense que c'est ceci le plus délicat à expliquer .

Dans la case B3 j'ai donc créé une liste déroulante (dans l'exemple on va se contenter de deux mais il y a beaucoup d'autres...) : Soit le 7H15 I, soit le 7H45 S. Le premier problème est que si vous cliquez sur 7H45 S il m'affiche enfaite 7H45 I puisque la cellule reste au format hh"H"mm "I" et non hh"H"mm "S".

Ma macro OI consiste à colorier le fond en bleu et demander un affichage hh"H"mm "I"
Ma macro OS consiste à colorier le fond en rouge et demander un affichage hh"H"mm "S"

A ce stade, je n'arrive pas à ce que les deux macros s'exécutent correctement. C'est à dire, si je sélectionne le premier item de ma liste, 7H15 I, cela exécute la macro 1 et le second item de ma liste, la macro 2.

Je ne sais pas si j'ai réussi à rendre ceci compréhensible?

Merci encore !
 

Pièces jointes

  • TEST.xls
    46 KB · Affichages: 27

ChTi160

XLDnaute Barbatruc
Bonsoir Gladou
Bonsoir le Fil,le Forum
cela semble fonctionner .
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("B3").Address Then
Select Case Format(Target.Value, "h:mm")
Case Is = "7:15": OI
Case Is = "7:45": OS
End Select
End If
End Sub
jean marie
 

Gladou

XLDnaute Nouveau
Génial!

Merci beaucoup pour toutes ces réponses!

Si ce n'est pas trop demander, quelle est la logique que je dois avoir quand j'écris le code?
Car je l'ai "bidouillé" à force de recherche et d'observation mais pas écris parce que je m'y connais... C'est parce que j'utilise Target.Value qu'il attend une précision? Enfin c'est peut être trop compliqué à expliquer aussi ^^
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
La logique à avoir quand on écrit du code pour Excel, ou plus exactement ce qu'il faut toujours garder à l'esprit, c'est de ne pas confondre ce qu'on voit ou veut voir dans une cellule avec sa valeur.
Parce que ce qu'on y voit c'est toujours du texte. Sa valeur quant à elle peut certes être de type String, mais aussi Double, Date, Currency, Boolean, Empty ou Error.
Dans un sens, oui à votre question, bien qu'il n'y ait de quelconque précision attendue, puisque Target.Value donne la valeur de la cellule. Si c'est le texte affiché dedans que vous voulez, et qui résulte de la recombinaison de sa valeur avec son format, c'est Target.Text.
 
Dernière édition:

Gladou

XLDnaute Nouveau
Je crois que je n'ai jamais vue cette réponse avant, mais merci beaucoup pour l'explication en tout cas ☺️!

Bonsoir.
La logique à avoir quand on écrit du code pour Excel, ou plus exactement ce qu'il faut toujours garder à l'esprit, c'est de ne pas confondre ce qu'on voit ou veut voir dans une cellule avec sa valeur.
Parce que ce qu'on y voit c'est toujours du texte. Sa valeur quant à elle peut certes être de type String, mais aussi Double, Date, Currency, Boolean, Empty ou Error.
Dans un sens, oui à votre question, bien qu'il n'y ait de quelconque précision attendue, puisque Target.Value donne la valeur de la cellule. Si c'est le texte affiché dedans que vous voulez, et qui résulte de la recombinaison de sa valeur avec son format, c'est Target.Text.
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 344
Membres
102 865
dernier inscrit
FreyaSalander