Affecté macro à liste déroulante

Bonjour,

J'aimerais créé une liste déroulante en A1 pour les 12 mois de l'année,

sur mon fichier, j'ai fais pour Mars, Avril, Mai, j'ai créé 3 boutons affectés à 3 macros différentes, mais j'aimerais ne pas avoir de bouton, simplement un menu déoulant executant les macros selon les mois séléctionnés......

Les mois sont lignes 61 pour la validation de données...

J'ai beau chercher, je n'y arrive pas, pourriez-vous m'aider?

Cordialement

Bonjour,

Une proposition, si j'ai bien compris, en pièce jointe.

J'ai supprimé la fusion de cellules A1:A2 et augmenté la hauteur de la ligne 1.

J'ai supprimé les boutons et le Module1.

Bonjour,

Un grand merci pour ton aide,

Je souhaitais afficher également avec le mois en cours, les 2 derniers mois c'est à dire lorsque je sélectionne MARS j'ai bien le mois de MARS mais également AVRIL ET MAI (qui correspondent aux Moyennes du début)


Exemple en pièce jointe

capture

Bonjour,

Autre proposition :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim mois$, plm$, km$, k%, kk%
    If Target.Cells(1, 1).Address = "$A$1" Then
        Application.ScreenUpdating = False
        With me
            mois = .Range("A1")
            .Columns("A:BC").Hidden = False
            On Error GoTo noMois
            k = WorksheetFunction.Match(mois, Rows(4), 0)
            kk = WorksheetFunction.Match(mois, Rows(3), 0)
            On Error GoTo 0
            plm = .Cells(3, kk).MergeArea.Address
            km = Chr(k + 96)
            .Columns(km & ":BC").Hidden = True
            .Range(plm).EntireColumn.Hidden = False
            Exit Sub
noMois:
            Retour
        End With
    End If
End Sub

Placée dans le module de la feuille.

Conservée dans Module1 (avec bouton sur feuille) :

Sub Retour()
    ActiveSheet.Columns("A:BC").Hidden = False
End Sub

Cordialement.

Merci les amis,

cependant, il me faut simplement les 2 derniers mois avec le mois en cours, pas toute la liste ;/

Re,

Modif pour ça :

            plm = .Cells(3, kk).MergeArea.Address
            km = Chr(IIf(k > 3, k + 94, 98)) & ":" & Chr(k + 95)
            .Columns("B:BC").Hidden = True
            .Columns(km).Hidden = False
            .Range(plm).EntireColumn.Hidden = False

Merci infiniment,

ça marche !! Dire que j'étais parti pour enregistrer les macros une par une !!

Merci :D

Bonsoir la communauté

Une gentille âme pour m'expliquer un peu cette macro ? J'ai beau essayer de la comprendre par moi même, je n'y arrive pas du tout. J'ai essayé de faire apparaître les 3 derniers mois en historique (au lieu de 2) pour comprendre la macro, je ne vois pas du tout, j'ai touché un peu à tout mais rien de bien concluant ...

Merci infiniment de votre part

Fred

Bonsoir,

Qu'est-ce qui t'arrête ?

Je me rends compte que j'ai codé sur des minuscules au lieu de majuscules (ça fonctionne quand même...), c'est certainement parce que je venais de faire juste avant un codage sur des minuscules !

Si c'est autour des définitions de colonnes que tu bloques, a est le caractère 97, les autres suivent (A est le 65...), il faut faire quelques calculs avec les codes de caractères...

Cordialement.

disons que j'aurai bien aimé avoir les commentaires sous chaque ligne de codes, ou alors un raisonnement en 2 lignes sur ta façon de procédés ou les lignes directives que tu as suivis, je trouve encore une fois cela très impressionnant

La macro se lance au changement (par liste déroulante) en A1. A1 étant dans un groupe fusionné, on vérifie la source de l'évènement Change sur l'adresse de Target.Cells(1, 1) [Target étant le groupe de cellules fusionnées dans un tel cas].

La vérification étant positive, on exécute... On doit afficher la zone du mois (à partir de M) indiqué en A1 et les deux mois qui précèdent dans la zone B:L), et masquer le reste...

La structure générale est simple :

1) On affiche tout : .Columns("A:BC").Hidden = False

2) On masque tout sauf A : .Columns("B:BC").Hidden = True

NB- Cela peut paraître inutile de démasquer pour tout remasquer (sauf A qui n'est jamais masquée), mais l'on a intérêt à ce que toutes les colonnes soient démasquées pour ce qui se passe entre le 1) et le 2) (voir plus loin).

3) On démasque les colonnes qu'on aura définies après 1) de la zone B:L dans la variable km : .Columns(km).Hidden = False (km étant un adressage de colonne)

4) On démasque la zone mois qu'on aura identifiée par la cellule fusionnée portant le nom du mois (après 1)) dont on a stocké l'adresse dans la variable plm : .Range(plm).EntireColumn.Hidden = False (plm étant une adresse ne couvrant pas les colonnes entières, on l'étend avec EntireColumn pour appliquer la commande).

Pour réaliser les 3) et 4), il faut avoir défini les zones à démasquer, soit les variables plm et km. On récupère le mois en A1 dans la variable mois.

Pour ce qui concerne la zone mois on va le chercher dans la ligne 3 en utilisant la fonction Excel EQUIV (Match). La variable kk nous renvoie le numéro de colonne du mois. Soit si on cherche MARS, Match renverra 13 (colonne M), recueilli dans la variable kk.

Mais Mars se trouve dans une cellule fusionnée comportant plusieurs colonnes, qui sont les colonnes de la zone mois que l'on veut identifier. On va récupérer simplement l'adresse de l'ensemble de cellules fusionnées avec :

plm = .Cells(3, kk).MergeArea.Address Pour MARS plm contiendra le texte : $M$13:$Q$13.

Pour la plage mois, la variable plm est prête pour le démasquage défini au 4) ci-dessus.

Pour ce qui concerne les deux mois précédents : on recherche de la même façon que précédemment le mois avec Match, dans la ligne 4. On recueille le numéro de colonne dans la variable k. Pour Mars, Match renverra 3 (colonne C).

Il faudrait donc afficher les deux colonnes qui précèdent, mais janvier ne figure pas, donc dans ce cas particulier on ne pourra en afficher qu'une : la B. On va déterminer l'affichage des colonnes à afficher :

km = Chr(IIf(k > 3, k + 94, 98)) & ":" & Chr(k + 95)

de k=4 à 12, on sait que l'on aura à afficher les 2 col. précédentes, par ex. pour k =6 (F: Juin), on devra afficher les colonnes 4 et 5 (D et E), on va donc construire le texte D:E qui constituera une adresse de colonnes.

En prenant les caractères k+94 et k+95, soit quand k=6, les caractères 100 et 101 et en les séparant par ":" on obtiendra la chaîne : d:e [désolé ! , j'ai construit des minuscules... mais Excel les prend quand même]

Pour k=3, cela donnerait a:b, mais on sait que dans ce cas il ne faut prendre que b, d'où l'expression conditionnelle dans la ligne de code avec Iif (fonction VBA ayant une syntaxe analogue à la fonction SI d'Excel) : si k est supérieur à 3 on prend le caractère k+94, sinon le caractère 98 (=b). k+95 donnant 98 si k=3, on aura donc b:b...

On n'a pas pris en compte le cas k =2, on verra ensuite pourquoi....

Pour rétablir des majuscules dans la ligne ci-dessus, il faut remplacer 94 par 62, 98 par 66 et 95 par 63...

Pour les colonnes mois précédents, km est donc prête pour le démasquage défini au 3)

Autres éléments du code :

Application.ScreenUpdating = False inhibe le raffraichissement de l'affichage, ce qui permet au code de s'exécuter plus rapidement, et évite des tremblottements, etc.

With Me Me est un mot-clé utilisable exclusivement dans les modules d'objets (feuilles, classeur, userforms) qui désigne l'objet auquel le module est attaché, en l'occurrence ici, la feuille Données.

On Error GoTo noMois et On Error GoTo 0, ainsi que l'étiquette noMois:

Il s'agit d'une gestion d'erreur. Si une erreur intervient dans le code qui suit la première instruction, le programme ira se brancher sur l'étiquette noMois. La seconde instruction annule cette gestion, et à partir de là une erreur se traduira par le blocage habituel de la procédure.

Entre les deux instructions figurent les recherche du mois sur les lignes 3 et 4 avec la fonction Match. La liste déroulante peut en effet afficher JANVIER et FEVRIER. mais ces mois ne figurent pas ligne 3, et déclencheront donc une erreur.

Dans ce cas, le programme ira donc se brancher sur noMois et exécutera la ligne suit, soit la proc. Retour qui affiche tout...

Février figure cependant sur la ligne 4, mais comme sa recherche sur la ligne 3 aura déclenché une erreur, il était inutile que l'on prévoit le traitement de k=2...

Noter que la ligne qui précède l'étiquette est une instruction Exit Sub de façon que dans le déroulement normal on n'exécute pas la partie de code prévue en cas d'erreur...

Je crois qu'il ne reste plus de ligne à expliquer !

Rechercher des sujets similaires à "affecte macro liste deroulante"