Tri des onglets par Date dans cellule

Résolu
1Globule Messages postés 62 Statut Membre -  
1Globule Messages postés 62 Statut Membre -
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. mrjenkins Messages postés 611 Statut Membre 103
     
    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
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  3. 1Globule Messages postés 62 Statut Membre 2
     
    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. mrjenkins Messages postés 611 Statut Membre 103
       
      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. 1Globule Messages postés 62 Statut Membre 2 > mrjenkins Messages postés 611 Statut Membre
       
      Merci, 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. mrjenkins Messages postés 611 Statut Membre 103
       
      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. 1Globule Messages postés 62 Statut Membre 2 > mrjenkins Messages postés 611 Statut Membre
       
      Hum,
      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. mrjenkins Messages postés 611 Statut Membre 103
       
      Tu peux m'envoyer tout le code que je regarde (entre <code basic et </code>)
      0