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 :

Trier des onglets selon mois [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    apt
    apt est déconnecté
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Points : 118
    Points
    118
    Par défaut Trier des onglets selon mois
    Bonsoir à tous,

    J'aimerais trier des onglets d'une feuille selon les noms des mois de l'année.

    Mais je cherche encore une idée.

    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
    Sub SortTabs()
        Dim lp As Integer, counter As Integer
        Dim myMnth()
     
        myMnth = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
        'On ne prend pas la première feuille
        For lp = 2 To Sheets.Count
            If Sheets(lp).Visible = True Then
                For counter = 12 To (lp - 1)
                    If Sheets(counter).Visible = True Then
                        If (UCase(Sheets(lp).Name) < UCase(Sheets(counter).Name)) Then
                            Sheets(lp).Move Before:=Sheets(counter)
                            Exit For
                        End If
                    End If
                Next counter
            End If
        Next lp
     
    End Sub
    Merci.

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    essayes comme ça
    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
    Sub tri_feuil()
    Dim fl As Worksheet, x As Integer, y As Integer
    Dim myMnth()
    y = 3
    myMnth = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
     
    For x = 0 To 11
      For Each fl In Worksheets
        If fl.Name <> "feuil1" Then'nom feuille non concernée
          If UCase(fl.Name) = UCase(myMnth(x)) Then
            fl.Move Before:=Sheets(y): y = y + 1
          End If
        End If
     Next fl
    Next x
     
    End Sub

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Une autre proposition
    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
    Sub TriFeuilles()
    Dim i As Integer
     
    For i = 12 To 1 Step -1
        If Existe(i) Then Worksheets(MonthName(i)).Move After:=Worksheets(1)
    Next i
    End Sub
     
    Private Function Existe(ByVal i As Byte) As Boolean
    Dim Sh As Worksheet
     
    For Each Sh In ThisWorkbook.Worksheets
        If UCase(Sh.Name) = UCase(MonthName(i)) Then
            Existe = True
            Exit For
        End If
    Next Sh
    End Function

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir mercatog,
    Je souris souvent quand je vois tes propositions propres et faisant appel à des fonctions ou des formules rarement utilisées, dommage que je commence à avoir les neurones du souvenir qui commencent à me quitter.

    Bonne soirée

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonsoir Dominique
    Ta proposition est pour moi plus optimale du moment que tu utilises une seule boucle.

    Pour l'histoire des neurones, je t'assure que ma courbe est déjà décroissante et ce forum est une occasion pour les faire travailler.

    Mes amitiés.

  6. #6
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    En reprenant la proposition de mercatog, ci-joint solution plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub tri_feuil()
    Dim fl As Worksheet, x As Integer, y As Integer
    y = 3
    For x = 1 To 12
      For Each fl In Worksheets
        If UCase(fl.Name) = UCase(MonthName(x)) Then
          fl.Move Before:=Sheets(y): y = y + 1
        End If
     Next fl
     If y = Sheets.Count Then Exit For
    Next x
     
    End Sub
    Bonne nuit à tou(te)s

  7. #7
    apt
    apt est déconnecté
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Points : 118
    Points
    118
    Par défaut
    Bonjour casefeyer, mercatog

    Merci pour toutes vos solutions.

    Comme je suis à la quatrième feuille (Mois de Mars), j'ai limité le compteur de feuille au nombre existant, et je me suis passé de l'utilisation de la fonction Existe, parce que je l'utilise déjà pour en créer les feuilles au premier jour de chaque mois.


    Voila le code :

    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
    Sub TriOnglets()
        Dim i As Integer, Cnt As Integer
        Dim Sh As Worksheet
     
        'Les feuilles sont créées selon le mois en cours
        'Alors la dernière feuille est "Mars"
        'Cnt = 4
        Cnt = Application.Min(12, Sheets.Count)
     
        For i = Cnt To 1 Step -1
            For Each Sh In ThisWorkbook.Worksheets
                If UCase(Sh.Name) = UCase(MonthName(i)) Then
                    Worksheets(MonthName(i)).Move After:=Worksheets(1)
                End If
            Next Sh
        Next i
    End Sub

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code qu'on pourrait simplifier comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TriOnglets()
    Dim i As Integer, Cnt As Integer
    Dim Sh As Worksheet
     
    Application.ScreenUpdating = False
    Cnt = Application.Min(12, Sheets.Count)
    For i = Cnt To 1 Step -1
        For Each Sh In ThisWorkbook.Worksheets
            If UCase(Sh.Name) = UCase(MonthName(i)) Then Sh.Move After:=Worksheets(1)
        Next Sh
    Next i
    End Sub

  9. #9
    apt
    apt est déconnecté
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Points : 118
    Points
    118
    Par défaut
    Merci mercatog

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

Discussions similaires

  1. [XI rR4] trier des dates par mois croissant
    Par damienmcc dans le forum Webi
    Réponses: 2
    Dernier message: 27/02/2013, 14h32
  2. trier des array selon le nombre de mots communs
    Par thib3113 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/05/2012, 18h38
  3. trier des mois bdd par date complete
    Par Djwaves dans le forum IHM
    Réponses: 3
    Dernier message: 05/11/2008, 12h02
  4. [MySQL] Trier des données selon l'entête de colonne
    Par Bibbe dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/11/2007, 01h17
  5. Tri des entrée selon le mois ou l'année
    Par karaemrah dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2007, 11h26

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