Tri des onglets par Date dans cellule

Résolu/Fermé
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 - 1 déc. 2016 à 09:31
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 - 1 déc. 2016 à 16:12
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 !

A voir également:

3 réponses

mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
1 déc. 2016 à 10:02
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
1 déc. 2016 à 10:32
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2
Modifié par 1Globule le 1/12/2016 à 12:48
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
mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
1 déc. 2016 à 14:18
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
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2 > mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018
1 déc. 2016 à 15:03
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
mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
1 déc. 2016 à 15:07
Il faut aussi modifier cette ligne :
    Erase dates
    ReDim dates(nbSheets, 1) As Variant


Par
    Erase dates
    ReDim dates(nbSheets, 3) As Variant
0
1Globule Messages postés 62 Date d'inscription mercredi 4 mai 2016 Statut Membre Dernière intervention 28 mars 2019 2 > mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018
1 déc. 2016 à 15:09
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
mrjenkins Messages postés 577 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 17 juillet 2018 102
Modifié par mrjenkins le 1/12/2016 à 15:13
Tu peux m'envoyer tout le code que je regarde (entre <code basic et </code>)
0