Tri des onglets par Date dans cellule

Résolu
Bonjour,

J'ai un classeur avec une feuille "Menu" suivie d'un nombre indéfini d'onglets.
Dans chaque onglet, il y a une date en C2.

J'aimerais, à l'ouverture du classeur, parcourir chaque onglet et afficher, dans la feuille "Menu" (cellules Q4 à Q18), les 15 noms d'onglets dont la date est la plus vieille.

Si quelqu'un a une piste... ce serait vraiment chouette.

Merci !

3 réponses

  1. Bonjour,

    copie-colle ceci dans Thisworkbook (VBA) :


    Private Sub Workbook_Open()
    nbSheets = ThisWorkbook.Sheets.Count

    ReDim dates(nbSheets - 2, 1) As Variant
    sh = 0
    For Each ws In Worksheets
    If ws.Name <> "Menu" Then
    dates(sh, 0) = ws.Range("C2").Value
    dates(sh, 1) = ws.Name

    sh = sh + 1
    End If
    Next ws

    nb = UBound(dates)
    tab_temp = dates
    Erase dates
    ReDim dates(nbSheets, 1) As Variant
    For i = 0 To nb
    pos = 0
    For l = 0 To nb
    If tab_temp(i, 0) > tab_temp(l, 0) And i <> l Then
    pos = pos + 1
    End If
    Next
    For ii = 1 To 1
    If dates(pos, 0) = "" Then
    dates(pos, 0) = tab_temp(i, 0)
    dates(pos, 1) = tab_temp(i, 1)
    Else
    pos = pos + 1
    ii = ii - 1
    End If
    Next
    Next

    For i = 1 To 15
    ThisWorkbook.Sheets("Menu").Cells(i+3, "Q").Value = dates(i - 1, 1)
    ThisWorkbook.Sheets("Menu").Cells(i+3, "P").Value = dates(i - 1, 0)
    Next
    End Sub



    --
    0
    1. Contributeur
      Bonjour,

      Je suppose que tu pensais bien le faire en macro :
      Private Sub Workbook_Open() ' affiche les noms des 15 onglets les plus anciens
      Dim feu As Worksheet, idd As Long, dat As Variant, nom As Variant, mdn As Variant
      ReDim tbd(1 To 15), tbn(1 To 15)
      For Each feu In ThisWorkbook.Sheets
          If feu.Name <> "Menu" Then
              dat = feu.[C2].Value: nom = feu.Name
              For idd = 1 To 15
                  If tbd(idd) = "" Then
                      tbd(idd) = dat: tbn(idd) = nom: Exit For
                  ElseIf dat < tbd(idd) Then
                      mdn = tbd(idd): tbd(idd) = dat: dat = mdn
                      mdn = tbn(idd): tbn(idd) = nom: nom = mdn
                  End If
              Next idd
          End If
      Next feu
      Sheets("Menu").[Q4:Q18].Value = Application.Transpose(tbn)
      End Sub
      
      0
      1. Merci à tous les deux, c'est vraiment gentil.
        Je pensais pouvoir adapter vos réponses mais je n'ai pas le niveau, visiblement...

        Du coup voici le besoin en totalité :
        En plus de la feuille "Menu", il y a une feuille "Temp" à ignorer (je le dis pour le Nb_Sheets).

        Sinon, le tri par date est parfait, j'ai juste besoin de récupérer plus d'info sur chaque onglet.
        En colonne S doit apparaitre le nom de chaque onglet (pas en Q finalement)
        En colonne T doit apparaitre la cellule J2 de chaque onglet
        En colonne U doit apparaitre la cellule C6 de chaque onglet
        En colonne V doit apparaitre la cellule C2 de chaque onglet
        Et en colonne W doit apparaitre le sigle "<", en gras et en centré...
        Donc la plage utilisée sera S4:W18 (s'il y a 15 onglets, sinon moins).

        Ce n'est pas si difficile je suppose, il suffit de récupérer un peu plus d'infos, mais...
        0
        1. Dans ce cas, il suffit d'ajouter un
          And ws.Name <> "Temp"

          dans les if.

          Pour ajouter les données, il suffit d'augmenter la taille du tableau (pour ma solution) :
          ReDim dates(nbSheets - 2, X) As Variant

          avec X le nombre de données à récupérer - 1
          Dans ton cas : 4 -1 : 3

          Et d'ajouter à la suite de
          dates(sh, 1) = ws.Name

          les lignes qui vont récupérer tes infos :
          dates(sh, 2) = ws.Range("J2").Value
          dates(sh, 3) = ws.Range("C6").Value
          


          Puis de recopier ces valeurs dans le for de fin :
           For i = 1 To 15
                  ThisWorkbook.Sheets("Menu").Cells(i+3, "S").Value = dates(i - 1, 1) 'le nom
                  ThisWorkbook.Sheets("Menu").Cells(i+3, "T").Value = dates(i - 1, 2)'J2
                  ThisWorkbook.Sheets("Menu").Cells(i+3, "U").Value = dates(i - 1, 3)'C6
                  ThisWorkbook.Sheets("Menu").Cells(i+3, "V").Value = dates(i - 1, 0)'C2
                  ThisWorkbook.Sheets("Menu").Cells(i+3, "W").Value = "<"
           Next
          
          0
        2. @mrjenkinsMerci, mais j'ai un bug au moment de la recopie des valeurs.
          En regardant en pas à pas, je me rends compte que, si je place le curseur sur ces lignes :
          dates(sh, 2) = ws.Range("J2").Value
          dates(sh, 3) = ws.Range("C6").Value
          J'obiens un : dates(sh, 2) = <L'indice n'appartient pas à la sélection.>

          Je précise que pour J2 et C6 les données sont de type string.
          0
        3. Il faut aussi modifier cette ligne :
              Erase dates
              ReDim dates(nbSheets, 1) As Variant
          


          Par
              Erase dates
              ReDim dates(nbSheets, 3) As Variant
          
          0
        4. @mrjenkinsHum,
          Encore un bug. En pas à pas sur ces lignes, les "dates" sont vides.
          dates(sh, 2) = ws.Range("J2").Value
          dates(sh, 3) = ws.Range("C6").Value
          0
        5. Tu peux m'envoyer tout le code que je regarde (entre <code basic et </code>)
          0