Tri de données en fonction de dates sélectionnées

Bonjour,

J'en appelle une nouvelle fois à votre aide car j'arrive au bout de mes capacités avec excel !

J'aimerais mettre en place un tableau qui trierai les données en fonction de leurs dates.

J'ai essayé, mais je n'y arrive pas… Si quelqu'un souhaite relever mon défi, je suis preneur.

Ci-joint un fichier avec un onglet récap et un onglet datas. J'aimerai qu'en tapant une date dans C2 de l'onglet récap, et en sélectionnant un nombre de jours dans la cellule B2, les informations qui sont dans l'onglet datas viennent se copier dans le tableau de l'onglet récap, et uniquement celles qui sont impactées par les dates comprises entre C2 et J2.

Afin de vous donner un exemple concret du résultat que je souhaiterai obtenir, j'ai rempli le tableau avec les informations qui devraient se coller avec le résultat recherché.

J'espère que c'est clair et que l'un d'entre-vous aura la gentillesse de m'aider. N'étant pas du tout capable de bidouiller dans des macros, ce serait top si vous aviez une solution avec des formules que je pourrais modifier si besoin.

Merci d'avance

19test.xlsx (15.68 Ko)

Bonjour,

J'ai nommé ta base sur datas Base !

Il faudra la commencer à A1 (c'est une manie de flanquer un tableau de données au milieu d'une page... ! ) puis la renommer en dynamique...

En C3, une formule un peu plus rationnelle s'impose :

=SI(ET(C2<>"";B2<>"");C2+B2-1;"")

A partir de là :

Sub Récap()
    Dim d1 As Date, d2 As Date, n%, i%, j%
    With Worksheets("Récap")
        On Error GoTo fin
        If .Range("C2") <> "" Then d1 = .Range("C2")
        If .Range("C3") <> "" Then d2 = .Range("C3")
        On Error GoTo 0
        .Range("B6").Resize(.UsedRange.Rows.Count, 5).ClearContents
    End With
    With [Base]
        .Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo
        For i = 1 To .Rows.Count
            If .Cells(i, 1) >= d1 Then Exit For
        Next i
        If i > .Rows.Count Then Exit Sub
        For j = i To .Rows.Count
            If .Cells(j, 1) > d2 Then Exit For
        Next j
        j = j - 1: n = j - i + 1
        Worksheets("Récap").Range("B6").Resize(n, 5).Value = .Rows(i).Resize(n).Value
    End With
fin:
End Sub

Il ne te reste qu' à tester...

Cordialement.

13dombal-test.xlsm (27.12 Ko)

Salut Dombal,

MFerrand, tiens donc!

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim dMainDate1 As Date
Dim dMainDate2 As Date
'
If Target.Address = [B2].Address Then
'
Application.EnableEvents = False
Application.ScreenUpdating = False
'
iRow = Range("B" & Rows.Count).End(xlUp).Row
Range("B6:F" & iRow).ClearContents
'
dMainDate1 = [C2]
dMainDate2 = [C3]
'
With Worksheets("datas")
    iRow = .Range("B" & Rows.Count).End(xlUp).Row
    iLig = 5
    For x = 5 To iRow
        If .Cells(x, 2) >= dMainDate1 And .Cells(x, 2) <= dMainDate2 Then
            iLig = iLig + 1
            Worksheets("Récap").Range("B" & iLig & ":F" & iLig).Value = .Range("B" & x & ":F" & x).Value
        End If
    Next
End With
'
Range("B6:F" & iLig).Sort Key1:=Range("B6"), Order1:=xlAscending
'
Application.EnableEvents = True
Application.ScreenUpdating = True
'
End If
'
End Sub

A tout à l'heure, MFerrand!?

A+

Merci MFerrand et Curulis57 !!

Merci pour vos réponses, mais je suis vraiment une quiche avec les macros et je n'arrive pas à faire fonctionner les 2 solutions que vous m'avez envoyées.

MFerrand, je n'ai pas compris ce que tu as voulu dire par "J'ai nommé ta base sur datas Base". Et qu'entends-tu par "la renommer en dynamique" ?

J'ai fait un test après avoir collé ta macro et avec le tableau de données en A1, mais ça ne fonctionne pas.

Curulis57, j'ai copié ta macro mais ça ne fonctionne pas non plus...

Je me doute que vos 2 solutions fonctionnent très bien, mais comme précisé dans mon mail, je suis nul en macro (mais je le vis bien, ne vous inquiétez pas

Si vous pouviez m'éclairer un peu, je ne cherche pas à ce qu'on fasse tout à ma place, mais là je sèche... désolé

La voilà avec un nom dynamique (regarder la formule qui permet de faire ça dans le Gestionnaire de noms).

Ainsi tu peux ajouter des lignes ou en enlever, le nom corrrespond toujours à la base telle qu'elle est.

Dans la colonne A qui sert à la dimensionner, il ne doit rien y avoir en dessous et pas de cellue vide à l'intérieur.

Cordialement.

14dombal-test.xlsm (26.95 Ko)

Salut Dombal,

les petites erreurs, ça use, ça use...

xlUp au lieu de xlDown et la vie retrouve du peps!

Il te suffit d'encoder un nombre en B2, Excel fait le reste.

A+

12finddates.xlsm (23.67 Ko)

Bonjour Curulis57,

Merci d'avoir modifié le fichier mais je pense qu'il y a encore un bug car si je fais un test en mettant par exemple 6 en cellule B2, avec en date le 07/01/2016 en cellule C2, ça devrait me donner les infos entre le 07/01 et le 13/01, mais ça me donne uniquement les infos sur le 13/01.

Si au lieu de 6, je tape 5 en B2, il n'y a plus aucune info dans le tableau...

Je suis paumé...

Problème de paramètres de formats de dates, qui cré un méli-mélo....

Merci MFerrand,

Je n'avais pas vu ce fichu format de date. Effectivement ça fonctionne super bien avec le bon format.

Si je veux étendre mes datas jusqu'à la colonne M au lieu de la colonne F, est-ce qu'il suffit de changer tous les F par M dans la macro ? ça me semble trop simple !!

Merci pour le temps que tu passes à m'aider, c'est sympa !

Dans mon code, pas de F... !

La base est nommée Base, au moyen de la formule :

=DECALER(datas!$A$2;;;NBVAL(datas!$A:$A)-1;5)

Ce qui indique que les données commencent en A2 et s'étendent sur 5 colonnes (donc jusqu'à E) et autant de lignes qu'il y en a.

En parlant de F, je suppose que tu parles de ta disposition initiale : je conseille à nouveau fortement de la changer, supprimer les lignes vides au-dessus de l'en-tête, et la colonne vide à gauche. L'en-tête sera ligne1, les données commencent ligne 2, et on part de la colonne A. C'est clair, net et sans risque d'erreurs pour la suite.

Dans cette disposition, si tu étends tes données sur 12 colonnes, tu changes le 5 final dans la formule (dans le Gestionnaire de noms) par 12.

=DECALER(datas!$A$2;;;NBVAL(datas!$A:$A)-1;12)

Si cela devait varier souvent? Tu peux rendre la prise en compte de l'extension en colonne automatique :

=DECALER(datas!$A$2;;;NBVAL(datas!$A:$A)-1;NBVAL(datas!$1:$1))

Dans le code, la modification à opérer n'affecte que la ligne ad'affectation à la fin :

        Worksheets("Récap").Range("B6").Resize(n, 5).Value = .Rows(i).Resize(n).Value

qui devient :

        Worksheets("Récap").Range("B6").Resize(n, 12).Value = .Rows(i).Resize(n).Value

Et si tu rends automatique l'extension en colonnes de la base, alors mettre :

        Worksheets("Récap").Range("B6").Resize(n, [Base].Columns.Count).Value = .Rows(i).Resize(n).Value

Cordialement.

Super, merci pour l'info !! Bonne fin de journée et bon weekend et encore merci pour ton aide

Rechercher des sujets similaires à "tri donnees fonction dates selectionnees"