IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

tri dictionary mois [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Par défaut tri dictionary mois
    Bonjour,

    En effectuant des recherches sur Google, je suis tombé sur un fichier qui pourrait répondre à mes besoins.
    Donc sur un feuille nommée BD, une suite de dates de A2 à Axx.
    Je voudrai afficher sur une autre feuille, dans combobox1 l’année (sans doublon) ou ‘Tout',
    et afficher dans combobox2 les mois triés sans doublons (en lettres) correspondants au choix de combobox1
    ou bien ‘Tout’ tout pour prendre en compte tous les mois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Option Explicit 'Dans module de feuille
    Dim F As Worksheet, dm As Object, dy As Object, dl As Long, Tb, i As Long
    Private Sub Worksheet_Activate()
       Set dy = CreateObject("Scripting.Dictionary")
       Set F = Worksheets("BD")
       dl = F.Range("A" & Rows.Count).End(xlUp).Row
       Tb = F.Range("A2:A" & dl).Value2
       dy("Tout") = ""
       For i = LBound(Tb) To UBound(Tb)
          If Not dy.Exists(Year(Tb(i, 1))) Then dy(Year(Tb(i, 1))) = ""
       Next i
       Me.ComboBox1.List = dy.Keys
    End Sub
     
    Private Sub ComboBox1_Change()
       Call CodeMois
       Set dm = CreateObject("Scripting.Dictionary")
       Set F = Worksheets("BD")
       Me.ComboBox2.Clear
     
       dl = F.Range("A" & Rows.Count).End(xlUp).Row
       Tb = F.Range("A2:A" & dl).Value2
       dm("Tout") = ""
     
       For i = LBound(Tb) To UBound(Tb)
       If Me.ComboBox1 = "Tout" Then
                If Not dm.Exists(Month(Tb(i, 1))) Then dm(sMois(Month(Tb(i, 1)))) = ""
    Else
          If Year(Tb(i, 1)) = CLng(Me.ComboBox1.Value) Then
             If Not dm.Exists(Month(Tb(i, 1))) Then dm(sMois(Month(Tb(i, 1)))) = ""
          End If
    End If
       Next i
      Me.ComboBox2.List = dm.Keys
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit 'Dans module standard
    Public sMois(1 To 12)
    Sub CodeMois()
       sMois(1) = "Janvier": sMois(2) = "Février": sMois(3) = "Mars": sMois(4) = "Avril"
       sMois(5) = "Mai": sMois(6) = "Juin": sMois(7) = "juillet": sMois(8) = "Août"
       sMois(9) = "Septembre": sMois(10) = "Octobre": sMois(11) = "Novembre": sMois(12) = "Décembre"
    End Sub
    Je ne parviens pas à afficher les mois triés. En vous remerciant.

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    nul part tu ne remplis Combobox2, tu te contentes de remplir le dictionnaire ... enfin j'imagine car ton premier code ne semble pas complet (pas de End Sub après la ligne 33)

    inspire toi de la ligne 12 du code que tu as posté, et fait la même opération après la ligne 33 avec ton dictionnaire de mois

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    nul part tu ne remplis Combobox2, tu te contentes de remplir le dictionnaire ... enfin j'imagine car ton premier code ne semble pas complet (pas de End Sub après la ligne 33)

    inspire toi de la ligne 12 du code que tu as posté, et fait la même opération après la ligne 33 avec ton dictionnaire de mois
    Merci beaucoup. Désolé, j'ai râté le copier/coller, il manquait la fin de la procédure.

    Les mois s'affichent bien dans la combobox2, mais ne sont pas triés.

    Encore merci.

    Bonne journée.
    nb: code corrigé dans mon premier post.

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Trié par ordre alphabétique ou chronologique ?

    Actuellement, ta liste est alimenté dans l'ordre d'apparition des mois au sein de ta colonne de dates, aucun tri n'est effectué

    pour le tri chronologique, on peut utiliser un second dictionnaire.
    on alimente le premier dictionnaire avec les numéros de mois
    ensuite on boucle de 1 à 12 et on récupère les noms de mois qui figurent dans le premier dictionnaire

    exemple pour ton module, j'ai un peu allégé ta procédure d'alimentation de Combobox2, et il y avait une coquille qui ajoutait les mois de toutes les dates existantes alors qu'on choisissait l'année Y

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Dim F As Worksheet, dm As Object, dy As Object, dl As Long, Tb, i As Long, dmBis As Object
    Private Sub Worksheet_Activate()
       Set dy = CreateObject("Scripting.Dictionary")
       Set F = Worksheets("BD")
       dl = F.Range("A" & Rows.Count).End(xlUp).Row
       Tb = F.Range("A2:A" & dl).Value2
       dy("Tout") = ""
       For i = LBound(Tb) To UBound(Tb)
          If Not dy.exists(Year(Tb(i, 1))) Then dy(Year(Tb(i, 1))) = ""
       Next i
       Me.ComboBox1.List = dy.keys
    End Sub
     
    Private Sub ComboBox1_Change()
    Call CodeMois
    Set dm = CreateObject("Scripting.Dictionary")
    Set dmBis = CreateObject("Scripting.Dictionary")
     
    With Worksheets("BD")
        Tb = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value2
    End With
     
    With Me
        .ComboBox2.Clear
     
        If .ComboBox1 = "Tout" Then
            .ComboBox2.List = sMois
        Else
            For i = LBound(Tb, 1) To UBound(Tb, 1)
                If Year(Tb(i, 1)) = CLng(.ComboBox1.Value) Then dm(Month(Tb(i, 1))) = ""
            Next i
     
            For i = 1 To 12
                If dm.exists(i) Then dmBis(i) = sMois(i)
            Next i
            .ComboBox2.List = dmBis.items
        End If
    End With
     
    End Sub

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Par défaut
    Joe.Levrai, Merci beaucoup.

    Très gentil de ta part, je vais pouvoir avancer.

    En fait, je voulais avoir en ordre croissant des mois en chiffres (1,2,3... mais que ça s'affiche en lettres janvier, février,...)

    exemple pour une année x, sur la feuille il y a des dates pour Février, Novembre, puis Janvier---> dans la combobox2: Janvier, Février puis Novembre.

    Respecter l'ordre des mois. Je n'ai pas encore intégré ton code dans mon véritable fichier, je n'ai testé que dans un fichier 'brouillon'.

    Apparemment, c'est bon.

    Toute ma gratitude.

    Bonne soirée.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Par défaut
    Désolé de revenir sur la solution. Je n'ai pas très bien expliqué mes attentes.

    Je viens de faire un test sur mon fichier. Il s'avère qu'en sélectionnant 'tout' dans la combobox1, les 12 mois de l'année s'affichent en combobox2.

    Ce n'est pas le résultat que je souhaite. Je n'ai gardé que quelques dates pour bien vérifier le résultat.

    Voilà, j'ai des dates pour 2017 pour les mois 1,2,11 et 12 et pour 2018 les mois 3,11 et 12 (sachant que les dates ne sont pas triées)

    en sélectionnant dans combobox1 --> 2017 ---- en combobox2: Janvier, Février, Novembre et Décembre ainsi que 'tout'

    en sélectionnant dans combobox1 --> 2018 ---- en combobox2: Mars, Novembre et Décembre ainsi que 'tout'

    et si en sélectionnant dans combobox1 --> tout---- en combobox2: Janvier, Février, Mars, Novembre et Décembre e ainsi que 'tout'

    Je ne sais pas si j'ai été plus clair.

    En vous remerciant par avance.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Dim SortedList As Object, t(): Set SortedList = CreateObject("System.Collections.SortedList")
    If Not SortedList.Contains("000012") Then SortedList.Add "000012", 12
    If Not SortedList.Contains("000002") Then SortedList.Add "000002", 2
    ReDim t(SortedList.Count - 1)
    For i = 0 To SortedList.Count - 1
         t(i) = SortedList.GetByIndex(i)
       Next
    SortedList.Clear
    End Sub
    Dernière modification par Invité ; 20/02/2018 à 16h13.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2K5] Tri des mois
    Par oupepasa dans le forum SSRS
    Réponses: 3
    Dernier message: 23/04/2009, 12h17
  2. Tri des mois dans l'ordre alphabétique et non chronologique
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 18
    Dernier message: 28/01/2008, 21h03
  3. Ordre de tri par mois et années dans une requête analyse croisée
    Par garsflo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/11/2007, 22h11
  4. Réponses: 5
    Dernier message: 10/03/2007, 22h45
  5. Requete de tri par mois
    Par Jay45 dans le forum Access
    Réponses: 1
    Dernier message: 03/04/2006, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo