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 onglet classeur excel par ordre croissant numéro et alphabétique [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut Trier onglet classeur excel par ordre croissant numéro et alphabétique
    Bonjour

    J'ai conçu la macro suivante pour trier les onglets NOTE XXX mais elle ne fonctionne pas.
    Etant débutante en vba je souhaiterais obtenir de l'aide.

    1. J'ai essayé de lancer la macro cependant j'ai une erreur d'exécution à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Right("00000" & Split(Sheets(i).Name, " ")(1), 5) > Right("00000" & Split(Sheets(j).Name, " ")(1), 5) Then
    2. je souhaiterais qu'il y ait un ordre également alphabétique
    Exemple :
    NOTE 4.0 Tableau new (30 juin)
    NOTE 4.0 Résultat financier
    Pouvez vous svp m'aider à la modifier?
    Merci par avance pour votre aide,
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonjour,
    Citation Envoyé par Anna_2013 Voir le message
    1. J'ai une erreur d'exécution à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Right("00000" & Split(Sheets(i).Name, " ")(1), 5) > Right("00000" & Split(Sheets(j).Name, " ")(1), 5) Then
    L'erreur est lié au fait que les feuilles par défaut Feuil1, Feuil2 Feuil3 ne respecte pas le format NOTE xxxx.
    Du coup le split ne retourne qu'un tableau avec une unique valeur.
    Et lorsqu'on essaye de prendre la seconde valeur du tableau

    Le code ci-dessous ne fait rien avec les feuilles qui ne respecte par le critère " "
    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_AvecNumero()
        Dim i As Integer, j As Integer
     
        Application.ScreenUpdating = False
        For i = 1 To Sheets.Count - 1
            If InStr(1, Sheets(i).Name, " ") > 0 Then
                For j = i + 1 To Sheets.Count
                    If InStr(1, Sheets(j).Name, " ") > 0 Then
                        If Right("00000" & Split(Sheets(i).Name, " ")(1), 5) > Right("00000" & Split(Sheets(j).Name, " ")(1), 5) Then
                           Sheets(j).Move before:=Sheets(i)
                        End If
                    End If
                Next j
            End If
        Next i
        Application.ScreenUpdating = True
     
    End Sub
    2. Pour faire un tri alphabéthique, tu peux regarder les options de comparaison sur les chaînes de caractère.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut Trier onglet
    Bonjour

    Je vous remercie pour votre aide.

    Après modifications de la macro en suivant vos instructions les onglets ne sont pas trier dans l'ordre alphanumérique croissant

    Je souhaiterais que NOTE 1 BILAN puis NOTE 1 COmpte de résultat.

    je ne parviens pas à modifier ma macro en conséquence
    Pourriez vous svp m'aider.

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La solution ci-dessous ne correspond pas tout à fait à ce que vous demandez, mais c'est comme cela que je l'aurais traitée dans votre situation :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    Option Explicit
     
    Sub TrierLesOnglets()
     
    Dim Sh As Worksheet
    Dim ShTri As Worksheet
    Dim ShEnCours As Worksheet
     
    Dim Cellule As Range
     
    Dim LigneTitreTri As Long
    Dim LigneEnCoursTri As Long
    Dim DerniereLigneTri As Long
    Dim CtrI As Long
     
    Dim CreationFeuilleTri As Boolean
     
    Dim MatriceFeuilles() As Variant
     
    Dim NomFeuille As String
    Dim NomFeuilleTri As String
     
            CreationFeuilleTri = True
     
             For Each Sh In Worksheets
     
                If Sh.Name = "Liste des onglets" Then CreationFeuilleTri = False
     
             Next Sh
     
             If CreationFeuilleTri = True Then
                Sheets.Add after:=Sheets(Sheets.Count)
                ActiveSheet.Name = "Liste des onglets"
     
            End If
     
            Set ShTri = Sheets("Liste des onglets")
            NomFeuilleTri = "'" & "Liste des onglets" & "'" ' Pour les liens hypertextes
            LigneTitreTri = 1
            ShTri.Cells(LigneTitreTri, 1) = "Onglets"
            LigneEnCoursTri = LigneTitreTri + 1
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 1)).Clear
     
          ShTri.Activate
     
     
         For Each Sh In Worksheets
     
            If Sh.Name <> ShTri.Name Then
     
              ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
              LigneEnCoursTri = LigneEnCoursTri + 1
     
            End If
     
         Next Sh
     
        ' Tri de la liste des onglets
     
        With ShTri
          .Columns("A:A").Select
          Selection.Sort Key1:=.Cells(LigneTitreTri, 1), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        End With
     
        DerniereLigneTri = ShTri.Cells(ShTri.Rows.Count, 1).End(xlUp).Row
     
        ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(DerniereLigneTri, 1)).Select
     
        ReDim MatriceFeuilles(Selection.Count - 1)
     
            CtrI = 0
            For Each Cellule In Selection
     
              MatriceFeuilles(CtrI) = Cellule
              CtrI = CtrI + 1
     
            Next Cellule
     
        For CtrI = UBound(MatriceFeuilles, 1) To LBound(MatriceFeuilles, 1) Step -1
     
            Select Case Mid(MatriceFeuilles(CtrI), 1, 5)
                Case "NOTE "
                   Sheets(MatriceFeuilles(CtrI)).Move before:=Sheets(1)
            End Select
     
        Next CtrI
     
         ShTri.Move before:=Sheets(1)
         ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 2)).Clear
     
         LigneEnCoursTri = LigneTitreTri + 1
         For Each Sh In Worksheets
            If Sh.Name <> ShTri.Name Then
     
              Set ShEnCours = Sheets(Sh.Name)
     
              ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
              If Sh.Visible = xlSheetHidden Then
                      ShTri.Cells(LigneEnCoursTri, 2) = "Cachée"
              Else
                      ShTri.Cells(LigneEnCoursTri, 2) = "Lien"
                      NomFeuille = "'" & Sh.Name & "'"  ' Pour les liens hypertextes
     
                      ' Crée un lien hypertexte à partir du nom de l'onglet avec l'onglet lui-même
                       ShTri.Hyperlinks.Add Anchor:=ShTri.Cells(LigneEnCoursTri, 2), Address:="", SubAddress:=NomFeuille & "!A1", TextToDisplay:="Lien"
                      ' On crée un lien hypertexte entre la nouvelle feuille client et le client de la feuille des clients
                       ShEnCours.Hyperlinks.Add Anchor:=ShEnCours.Range("A1"), Address:="", SubAddress:=NomFeuilleTri & "!B" & LigneEnCoursTri, TextToDisplay:="Retour liste des onglets"
     
              End If
     
              LigneEnCoursTri = LigneEnCoursTri + 1
              Set ShEnCours = Nothing
     
            End If
     
         Next Sh
     
      ShTri.Activate
     
      ' Mise en forme
      With ShTri
        .Columns("A:A").EntireColumn.AutoFit
        With .Range("A1")
            .Font.Bold = True
            .Interior.Pattern = xlSolid
            .Interior.PatternColorIndex = xlAutomatic
            .Interior.Color = 65535
        End With
        .Range("A2").Select
        ActiveWindow.FreezePanes = True
        .Range("A1").Select
     
       End With
     
     
       Set ShTri = Nothing
     
    End Sub

    Le code ci-dessus :

    • Crée une feuille (Liste des onglets) listant tous les onglets du fichier (même ceux cachés).
    • Ordonne la liste des noms d'onglets dans la feuille liste des onglets.
    • Ordonne les onglets dont les noms commencent par "Notes " dans le fichier dans l'ordre de cette liste.
    • Crée des liens hypertextes entre les noms d'onglets et les onglets eux-mêmes et réciproquement.


    Si la feuille Liste des onglets ne vous convient pas, rien ne vous empêche de détruire cette feuille à l'issue du programme et de neutraliser les liens hyptertextes dans le programme.

    Cordialement.
    Dernière modification par Invité ; 13/06/2013 à 15h03.

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai rectifié le fichier en pièce jointe de mon premier message car je n'avais pas fait attention qu'en cas d'absence de la feuille Liste des onglets, la nouvelle feuille n'était pas renommée en Liste des onglets.

    Désolé.

    Cordialement.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour votre aide.

    J'ai noté que j'ai des feuilles cachées comment puis je les supprimer en sachant dans quel onglet les trouver?

    Merci

    par ailleurs j'ai toujours le même problème avec les feuilles comportant les numéros 10 et 11 ils viennent s'interposer entre les onglets 0 et 2.

    Merci pour votre aide

    En pj j'ai plusieurs macro TRI laquelle dois je utiliser? Merci

    A quoi sert la Macro 4?

    Merci bcp
    Fichiers attachés Fichiers attachés

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Anna_2013 Voir le message
    par ailleurs j'ai toujours le même problème avec les feuilles comportant les numéros 10 et 11 ils viennent s'interposer entre les onglets 0 et 2.

    Merci pour votre aide
    C'est normal, c'est de l'alphanumérique.

    Pour régler ce problème, il faut plutôt intervenir lors de la génération de la feuille et adopter une numérotation de vos feuilles de 00 à 100 plutôt que de 0 à 10. L'espace ou l'underscore étant placés avant le 0, vous pouvez également numéroter de " 0" à " 9" ou _0 à _9 vos 10 premiers onglets.

    Cordialement.

    Citation Envoyé par Anna_2013 Voir le message
    En pj j'ai plusieurs macro TRI laquelle dois je utiliser? Merci

    A quoi sert la Macro 4?

    Merci bcp
    A rien.

    C'est une question d'habitude, le générateur de macro d'Excel permet d'obtenir la trame de votre code en simulant les actions au clavier.

    C'est souvent un grand gain de temps. Par contre, on peut oublier de nettoyer le code....

    Vous pouvez détruire.

    Cordialement.

    Citation Envoyé par Anna_2013 Voir le message
    par ailleurs j'ai toujours le même problème avec les feuilles comportant les numéros 10 et 11 ils viennent s'interposer entre les onglets 0 et 2.

    Merci pour votre aide
    Le code ci-dessous rectifie le nom des onglets NOTE 0. à 9.0 ou "0 " à "9 "
    et supprime ou non les feuilles cachées en fonction du paramétrage de la variable booléenne DesTructionFeuillesCachees = True ou False

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    Option Explicit
     
    Sub TrierLesOnglets()
     
    Dim Sh As Worksheet
    Dim ShTri As Worksheet
    Dim ShEnCours As Worksheet
     
    Dim Cellule As Range
     
    Dim LigneTitreTri As Long
    Dim LigneEnCoursTri As Long
    Dim DerniereLigneTri As Long
    Dim CtrI As Long
     
    Dim CreationFeuilleTri As Boolean
    Dim DesTructionFeuillesCachees As Boolean
     
    Dim MatriceFeuilles() As Variant
     
    Dim NomFeuille As String
    Dim NomFeuilleTri As String
    Dim NomFeuilleModifie As String
     
            CreationFeuilleTri = True
            DesTructionFeuillesCachees = True
     
             For Each Sh In Worksheets
     
                If Sh.Name = "Liste des onglets" Then CreationFeuilleTri = False
     
             Next Sh
     
             If CreationFeuilleTri = True Then
                Sheets.Add after:=Sheets(Sheets.Count)
                ActiveSheet.Name = "Liste des onglets"
     
            End If
     
            Set ShTri = Sheets("Liste des onglets")
            NomFeuilleTri = "'" & "Liste des onglets" & "'" ' Pour les liens hypertextes
            LigneTitreTri = 1
            ShTri.Cells(LigneTitreTri, 1) = "Onglets"
            LigneEnCoursTri = LigneTitreTri + 1
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 1)).Clear
     
            ShTri.Activate
     
            ' Renommage des feuilles de NOTES 00 à NOTES 09
            For Each Sh In Worksheets
                If Sh.Name <> ShTri.Name Then
                      Sh.Activate
                       NomFeuilleModifie = Sh.Name
                       Select Case Mid(Sh.Name, 1, 5)
                           Case "NOTE "
                               Select Case Mid(Sh.Name, Len("NOTE XX"), 1)
                                  Case ".", " "
                                    ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                               End Select
                       End Select
               End If
            Next Sh
     
     
           ' Destruction des feuilles cachées
           If DesTructionFeuillesCachees = True Then
                 For CtrI = Worksheets.Count To 1 Step -1
                  Select Case Worksheets(CtrI).Visible
                         Case False
                             Application.DisplayAlerts = False
                             Worksheets(CtrI).Delete
                             Application.DisplayAlerts = False
                 End Select
                Next CtrI
           End If
     
     
          ' Etablissement de la liste des feuilles dans Liste des onglets
          For Each Sh In Worksheets
            If Sh.Name <> ShTri.Name Then
              ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
              LigneEnCoursTri = LigneEnCoursTri + 1
            End If
          Next Sh
     
          ShTri.Activate
     
          ' Tri de la liste des onglets
            With ShTri
              .Columns("A:A").Select
              Selection.Sort Key1:=.Cells(LigneTitreTri, 1), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
            End With
     
            ' Chargement de la matrice des onglets
            DerniereLigneTri = ShTri.Cells(ShTri.Rows.Count, 1).End(xlUp).Row
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(DerniereLigneTri, 1)).Select
            ReDim MatriceFeuilles(Selection.Count - 1)
     
            CtrI = 0
            For Each Cellule In Selection
                        MatriceFeuilles(CtrI) = Cellule
                        CtrI = CtrI + 1
            Next Cellule
     
     
            ' Déplacement des feuilles
            For CtrI = UBound(MatriceFeuilles, 1) To LBound(MatriceFeuilles, 1) Step -1
                Select Case Mid(MatriceFeuilles(CtrI), 1, 5)
                    Case "NOTE "
                       Sheets(MatriceFeuilles(CtrI)).Move before:=Sheets(1)
                End Select
            Next CtrI
     
            ' Déplacement de la feuille Liste des onglets en position 1
            ShTri.Move before:=Sheets(1)
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 2)).Clear
     
            ' Raffraichissement de la feuille Liste des onglets
            LigneEnCoursTri = LigneTitreTri + 1
            For Each Sh In Worksheets
                   If Sh.Name <> ShTri.Name Then
                     Set ShEnCours = Sheets(Sh.Name)
                     ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
                     If Sh.Visible = xlSheetHidden Then
                             ShTri.Cells(LigneEnCoursTri, 2) = "Cachée"
                     Else
                             ShTri.Cells(LigneEnCoursTri, 2) = "Lien"
                             NomFeuille = "'" & Sh.Name & "'"  ' Pour les liens hypertextes
     
                             ' Crée un lien hypertexte à partir du nom de l'onglet avec l'onglet lui-même
                              ShTri.Hyperlinks.Add Anchor:=ShTri.Cells(LigneEnCoursTri, 2), Address:="", SubAddress:=NomFeuille & "!A1", TextToDisplay:="Lien"
                             ' Crée un lien hypertexte entre la nouvelle feuille client et le client de la feuille des clients
                              ShEnCours.Hyperlinks.Add Anchor:=ShEnCours.Range("A1"), Address:="", SubAddress:=NomFeuilleTri & "!B" & LigneEnCoursTri, TextToDisplay:="Retour liste des onglets"
     
                    End If
                    LigneEnCoursTri = LigneEnCoursTri + 1
                    Set ShEnCours = Nothing
                 End If
     
            Next Sh
     
     
           ' Mise en forme
           ShTri.Activate
           With ShTri
                .Columns("A:A").EntireColumn.AutoFit
                With .Range("A1")
                    .Font.Bold = True
                    .Interior.Pattern = xlSolid
                    .Interior.PatternColorIndex = xlAutomatic
                    .Interior.Color = 65535
                End With
                .Range("A2").Select
                ActiveWindow.FreezePanes = True
                .Range("A1").Select
           End With
     
           Set ShTri = Nothing
     
    End Sub

    Le fichier joint contient des feuilles supplémentaires NOTE 1, NOTE 2, NOTE 11, etc.... pour tester le code.

    Cordialement.
    Dernière modification par AlainTech ; 16/06/2013 à 12h38. Motif: Fusion de 3 messages

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut Trier les onglets vba 2010
    Merci bcp pour votre aide. Merci bcp pour les onglets avec retour aux liens hypertextes c vraiment génial.

    Cependant quand j'ai utilisé la macro l'onglet 9 se met en dernier après les notes 11 et 12 (voir fichier joint).

    Pourriez vous svp m'aider à la modifier.
    Par ailleurs dans le fichier zip que vous m'avez communiqué il y a 3 macro tri et je ne sais pas laquelle utiliser.

    Merci pour votre aide.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    Option Explicit
     
    Sub TrierLesOnglets()
     
    Dim Sh As Worksheet
    Dim ShTri As Worksheet
    Dim ShEnCours As Worksheet
     
    Dim Cellule As Range
     
    Dim LigneTitreTri As Long
    Dim LigneEnCoursTri As Long
    Dim DerniereLigneTri As Long
    Dim CtrI As Long
     
    Dim CreationFeuilleTri As Boolean
    Dim DesTructionFeuillesCachees As Boolean
     
    Dim MatriceFeuilles() As Variant
     
    Dim NomFeuille As String
    Dim NomFeuilleTri As String
    Dim NomFeuilleModifie As String
     
            CreationFeuilleTri = True
            DesTructionFeuillesCachees = True
     
             For Each Sh In Worksheets
     
                If Sh.Name = "Liste des onglets" Then CreationFeuilleTri = False
     
             Next Sh
     
             If CreationFeuilleTri = True Then
                Sheets.Add after:=Sheets(Sheets.Count)
                ActiveSheet.Name = "Liste des onglets"
     
            End If
     
            Set ShTri = Sheets("Liste des onglets")
            NomFeuilleTri = "'" & "Liste des onglets" & "'" ' Pour les liens hypertextes
            LigneTitreTri = 1
            ShTri.Cells(LigneTitreTri, 1) = "Onglets"
            LigneEnCoursTri = LigneTitreTri + 1
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 1)).Clear
     
            ShTri.Activate
     
            ' Renommage des feuilles de NOTES 00 à NOTES 09
            For Each Sh In Worksheets
                If Sh.Name <> ShTri.Name Then
                      Sh.Activate
                       NomFeuilleModifie = Sh.Name
                       Select Case Mid(Sh.Name, 1, 5)
                           Case "NOTE "
                               Select Case Mid(Sh.Name, Len("NOTE XX"), 1)
                                  Case ".", " "
                                    ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                               End Select
                       End Select
               End If
            Next Sh
     
     
           ' Destruction des feuilles cachées
           If DesTructionFeuillesCachees = True Then
                 For CtrI = Worksheets.Count To 1 Step -1
                  Select Case Worksheets(CtrI).Visible
                         Case False
                             Application.DisplayAlerts = False
                             Worksheets(CtrI).Delete
                             Application.DisplayAlerts = False
                 End Select
                Next CtrI
           End If
     
     
          ' Etablissement de la liste des feuilles dans Liste des onglets
          For Each Sh In Worksheets
            If Sh.Name <> ShTri.Name Then
              ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
              LigneEnCoursTri = LigneEnCoursTri + 1
            End If
          Next Sh
     
          ShTri.Activate
     
          ' Tri de la liste des onglets
            With ShTri
              .Columns("A:A").Select
              Selection.Sort Key1:=.Cells(LigneTitreTri, 1), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
            End With
     
            ' Chargement de la matrice des onglets
            DerniereLigneTri = ShTri.Cells(ShTri.Rows.Count, 1).End(xlUp).Row
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(DerniereLigneTri, 1)).Select
            ReDim MatriceFeuilles(Selection.Count - 1)
     
            CtrI = 0
            For Each Cellule In Selection
                        MatriceFeuilles(CtrI) = Cellule
                        CtrI = CtrI + 1
            Next Cellule
     
     
            ' Déplacement des feuilles
            For CtrI = UBound(MatriceFeuilles, 1) To LBound(MatriceFeuilles, 1) Step -1
                Select Case Mid(MatriceFeuilles(CtrI), 1, 5)
                    Case "NOTE "
                       Sheets(MatriceFeuilles(CtrI)).Move before:=Sheets(1)
                End Select
            Next CtrI
     
            ' Déplacement de la feuille Liste des onglets en position 1
            ShTri.Move before:=Sheets(1)
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 2)).Clear
     
            ' Raffraichissement de la feuille Liste des onglets
            LigneEnCoursTri = LigneTitreTri + 1
            For Each Sh In Worksheets
                   If Sh.Name <> ShTri.Name Then
                     Set ShEnCours = Sheets(Sh.Name)
                     ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
                     If Sh.Visible = xlSheetHidden Then
                             ShTri.Cells(LigneEnCoursTri, 2) = "Cachée"
                     Else
                             ShTri.Cells(LigneEnCoursTri, 2) = "Lien"
                             NomFeuille = "'" & Sh.Name & "'"  ' Pour les liens hypertextes
     
                             ' Crée un lien hypertexte à partir du nom de l'onglet avec l'onglet lui-même
                              ShTri.Hyperlinks.Add Anchor:=ShTri.Cells(LigneEnCoursTri, 2), Address:="", SubAddress:=NomFeuille & "!A1", TextToDisplay:="Lien"
                             ' Crée un lien hypertexte entre la nouvelle feuille client et le client de la feuille des clients
                              ShEnCours.Hyperlinks.Add Anchor:=ShEnCours.Range("A1"), Address:="", SubAddress:=NomFeuilleTri & "!B" & LigneEnCoursTri, TextToDisplay:="Retour liste des onglets"
     
                    End If
                    LigneEnCoursTri = LigneEnCoursTri + 1
                    Set ShEnCours = Nothing
                 End If
     
            Next Sh
     
     
           ' Mise en forme
           ShTri.Activate
           With ShTri
                .Columns("A:A").EntireColumn.AutoFit
                With .Range("A1")
                    .Font.Bold = True
                    .Interior.Pattern = xlSolid
                    .Interior.PatternColorIndex = xlAutomatic
                    .Interior.Color = 65535
                End With
                .Range("A2").Select
                ActiveWindow.FreezePanes = True
                .Range("A1").Select
           End With
     
           Set ShTri = Nothing
     
    End Sub
    Fichiers attachés Fichiers attachés

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans le fichier que je vous ai envoyé, il ne faut prendre que le module Module_TrierLesFeuilles et à l'intérieur il n'y a qu'une seule procédure.

    En ce qui concerne le positionnement de la feuille NOTE 9, ci-dessous le code correspondant au "renommage" des feuilles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            ' Renommage des feuilles de NOTES 00 à NOTES 09
            For Each Sh In Worksheets
                If Sh.Name <> ShTri.Name Then
                      Sh.Activate
                       NomFeuilleModifie = Sh.Name
                       Select Case Mid(Sh.Name, 1, 5)
                           Case "NOTE "
                               Select Case Mid(Sh.Name, Len("NOTE XX"), 1)
                                  Case ".", " "
                                    ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                               End Select
                       End Select
               End If
            Next Sh
    Deux cas sont testés, si les 5 premiers caractères du nom de l'onglet commence par "NOTE " (avec un blanc), on regarde ensuite quel est le caractère derrière le premier chiffre. Si c'est un point ou un blanc alors on ajoute un espace après "NOTE " et on reconstitue le nom avec le reste du libellé.

    Si la feuille "NOTE 9" n'a pas été traitée, c'est qu'on a un autre caractère après ou rien du tout. Pour régler ce problème, il faut indiquer tous les caractères (autres que des chiffres) pouvant être rencontrés après le premier chiffre et indiquer si on peut avoir également un libellé strictement "NOTE 9".

    En ce qui concerne ce dernier cas, il faut remplacer le bout de code précédent par celui ci :

    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
            ' Renommage des feuilles de NOTES 00 à NOTES 09
            For Each Sh In Worksheets
                If Sh.Name <> ShTri.Name Then
                      Sh.Activate
                       NomFeuilleModifie = Sh.Name
                       Select Case Mid(Sh.Name, 1, 5)
                           Case "NOTE "
                               Select Case Mid(Sh.Name, Len("NOTE XX"), 1)
                                  Case ".", " "
                                    ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                               End Select
                               If Len(Sh.Name) = Len("NOTE X") Then ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                       End Select
               End If
            Next Sh
    Le code complet du module "Module_TrierLesOnglets" devient donc :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    Option Explicit
     
    Sub TrierLesOnglets()
     
    Dim Sh As Worksheet
    Dim ShTri As Worksheet
    Dim ShEnCours As Worksheet
     
    Dim Cellule As Range
     
    Dim LigneTitreTri As Long
    Dim LigneEnCoursTri As Long
    Dim DerniereLigneTri As Long
    Dim CtrI As Long
     
    Dim CreationFeuilleTri As Boolean
    Dim DesTructionFeuillesCachees As Boolean
     
    Dim MatriceFeuilles() As Variant
     
    Dim NomFeuille As String
    Dim NomFeuilleTri As String
    Dim NomFeuilleModifie As String
     
            CreationFeuilleTri = True
            DesTructionFeuillesCachees = True
     
             For Each Sh In Worksheets
     
                If Sh.Name = "Liste des onglets" Then CreationFeuilleTri = False
     
             Next Sh
     
             If CreationFeuilleTri = True Then
                Sheets.Add after:=Sheets(Sheets.Count)
                ActiveSheet.Name = "Liste des onglets"
     
            End If
     
            Set ShTri = Sheets("Liste des onglets")
            NomFeuilleTri = "'" & "Liste des onglets" & "'" ' Pour les liens hypertextes
            LigneTitreTri = 1
            ShTri.Cells(LigneTitreTri, 1) = "Onglets"
            LigneEnCoursTri = LigneTitreTri + 1
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 1)).Clear
     
            ShTri.Activate
     
            ' Renommage des feuilles de NOTES 00 à NOTES 09
            For Each Sh In Worksheets
                If Sh.Name <> ShTri.Name Then
                      Sh.Activate
                       NomFeuilleModifie = Sh.Name
                       Select Case Mid(Sh.Name, 1, 5)
                           Case "NOTE "
                               Select Case Mid(Sh.Name, Len("NOTE XX"), 1)
                                  Case ".", " "
                                    ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                               End Select
                               If Len(Sh.Name) = Len("NOTE X") Then ActiveSheet.Name = "NOTE  " & Mid(NomFeuilleModifie, Len("NOTE X"))
                       End Select
               End If
            Next Sh
     
     
           ' Destruction des feuilles cachées
           If DesTructionFeuillesCachees = True Then
                 For CtrI = Worksheets.Count To 1 Step -1
                  Select Case Worksheets(CtrI).Visible
                         Case False
                             Application.DisplayAlerts = False
                             Worksheets(CtrI).Delete
                             Application.DisplayAlerts = False
                 End Select
                Next CtrI
           End If
     
     
          ' Etablissement de la liste des feuilles dans Liste des onglets
          For Each Sh In Worksheets
            If Sh.Name <> ShTri.Name Then
              ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
              LigneEnCoursTri = LigneEnCoursTri + 1
            End If
          Next Sh
     
          ShTri.Activate
     
          ' Tri de la liste des onglets
            With ShTri
              .Columns("A:A").Select
              Selection.Sort Key1:=.Cells(LigneTitreTri, 1), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
            End With
     
            ' Chargement de la matrice des onglets
            DerniereLigneTri = ShTri.Cells(ShTri.Rows.Count, 1).End(xlUp).Row
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(DerniereLigneTri, 1)).Select
            ReDim MatriceFeuilles(Selection.Count - 1)
     
            CtrI = 0
            For Each Cellule In Selection
                        MatriceFeuilles(CtrI) = Cellule
                        CtrI = CtrI + 1
            Next Cellule
     
     
            ' Déplacement des feuilles
            For CtrI = UBound(MatriceFeuilles, 1) To LBound(MatriceFeuilles, 1) Step -1
                Select Case Mid(MatriceFeuilles(CtrI), 1, 5)
                    Case "NOTE "
                       Sheets(MatriceFeuilles(CtrI)).Move before:=Sheets(1)
                End Select
            Next CtrI
     
            ' Déplacement de la feuille Liste des onglets en position 1
            ShTri.Move before:=Sheets(1)
            ShTri.Range(ShTri.Cells(LigneTitreTri + 1, 1), ShTri.Cells(ShTri.Rows.Count, 2)).Clear
     
            ' Raffraichissement de la feuille Liste des onglets
            LigneEnCoursTri = LigneTitreTri + 1
            For Each Sh In Worksheets
                   If Sh.Name <> ShTri.Name Then
                     Set ShEnCours = Sheets(Sh.Name)
                     ShTri.Cells(LigneEnCoursTri, 1) = Sh.Name
                     If Sh.Visible = xlSheetHidden Then
                             ShTri.Cells(LigneEnCoursTri, 2) = "Cachée"
                     Else
                             ShTri.Cells(LigneEnCoursTri, 2) = "Lien"
                             NomFeuille = "'" & Sh.Name & "'"  ' Pour les liens hypertextes
     
                             ' Crée un lien hypertexte à partir du nom de l'onglet avec l'onglet lui-même
                              ShTri.Hyperlinks.Add Anchor:=ShTri.Cells(LigneEnCoursTri, 2), Address:="", SubAddress:=NomFeuille & "!A1", TextToDisplay:="Lien"
                             ' Crée un lien hypertexte entre la nouvelle feuille client et le client de la feuille des clients
                              ShEnCours.Hyperlinks.Add Anchor:=ShEnCours.Range("A1"), Address:="", SubAddress:=NomFeuilleTri & "!B" & LigneEnCoursTri, TextToDisplay:="Retour liste des onglets"
     
                    End If
                    LigneEnCoursTri = LigneEnCoursTri + 1
                    Set ShEnCours = Nothing
                 End If
     
            Next Sh
     
     
           ' Mise en forme
           ShTri.Activate
           With ShTri
                .Columns("A:A").EntireColumn.AutoFit
                With .Range("A1")
                    .Font.Bold = True
                    .Interior.Pattern = xlSolid
                    .Interior.PatternColorIndex = xlAutomatic
                    .Interior.Color = 65535
                End With
                .Range("A2").Select
                ActiveWindow.FreezePanes = True
                .Range("A1").Select
           End With
     
           Set ShTri = Nothing
     
    End Sub

    Un conseil également : Il vous faut nommer vos modules d'un nom explicite, sinon c'est le brain.... pour celui qui va maintenir votre outil. Ca coûte pas cher mais cela fait gagner du temps.

    Cordialement.
    Dernière modification par AlainTech ; 16/06/2013 à 12h39. Motif: Suppression de la citation

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Monsieur KERGRESSE,

    Je vous remercie énormément pour votre aide très précieuse.

    Vous m'avez épargné de copier coller en valeur 115 onglets groupés dans 20 classeurs différents.

    Merci pour votre aide et patience.

    Anna

    J'ai une dernière question après l'ajout de cette macro dans le module développeur excel m'informe que l'espace mémoire disponible est insuffisant et je ne sais pas comment régler ce problème.
    Merci d'avance

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Anna_2013 Voir le message
    J'ai une dernière question après l'ajout de cette macro dans le module développeur excel m'informe que l'espace mémoire disponible est insuffisant et je ne sais pas comment régler ce problème.
    Merci d'avance
    Le problème de mémoire ne vient pas de mon module. Si vous observez le code, mes variables affectées avec Set sont automatiquement détruites dans la même procédure. Il ne peut pas y avoir de saturation de la pile.

    J'ai constaté également que lorsque je travaillais avec le site Développez.com ouvert en parallèle et en travaillant avec les ouvertures de fenêtre pour observer le code ou des images, il arrivait un moment où je ne pouvais plus ouvrir de fichiers Excel faute de mémoire.

    Je vous propose de vous déconnecter d'Internet et de recommencer la séquence en ayant redémarré votre ordinateur et regardez si le problème demeure. Ce serait intéressant d'avoir un retour.

    Cordialement.

    Je n'avais fait attention à tout votre message, quelles procédures utilisez-vous pour faire vos copies ? Mettez les en ligne pour vérifier si des affectations vont saturer la mémoire parce que non détruites.

    Cordialement.

    Anna: Regardez dans votre procédure CombineFiles du module 1 : Vous affectez vos variables classeur et feuilles avec des Set Wkb = Workbooks.Open(FileName:=FileName) sans jamais les détruire avec des Set Wkb = Nothing.
    Dernière modification par AlainTech ; 16/06/2013 à 12h42. Motif: Fusion de 2 messages

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 12
    Points
    12
    Par défaut Merci
    Merci

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

Discussions similaires

  1. [OpenOffice][Tableur] Comment trier numéros sur plusieurs colonnes par ordre croissant
    Par bordelaplage dans le forum OpenOffice & LibreOffice
    Réponses: 8
    Dernier message: 10/04/2015, 23h16
  2. Trier par ordre croissant
    Par hitchcoke dans le forum Langage
    Réponses: 12
    Dernier message: 04/08/2009, 14h15
  3. Réponses: 2
    Dernier message: 17/06/2007, 19h17
  4. [VBA]Trier les valeur d une liste par ordre croissant
    Par PierrotKun dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/03/2007, 09h37
  5. Trier un tableau par ordre croissant
    Par Halleck dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 01/11/2004, 00h04

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