Récupérer date la plus récente

Bonjour,

Dans mon fichier excel qui est destiné à faire un inventaire, je souhaite pouvoir récupérer la date la plus récente du dernier inventaire d'un produit.

C'est à dire que dans une feuille on retrouve tous les inventaires un à un avec le produit correspondant. (en tout 30 produits) et dans l'autre feuille on trouveras les 30 produits et le but est que l'on puisse connaître la date de notre dernier inventaire.

De ce fait je n'arrive pas à trouver une formule qui pourrait récupérer cette date.

Merci d'avance !

FunkFlok

Bonjour le forum,

Voir formule jointe à adapter au cas présenté.

100derniere-date.xlsx (10.41 Ko)

Ce n'est pas exactement ce que je souhaite, en faite j'aimerais que ce soit sous vba à l'aide d'un bouton l'information devras être récupéré de la manière suivante :

Si produit est identique dans l'autre feuille

Chercher la date la plus récente entre tous ces produits

et la noter dans la cellule correspondant au produit

Merci pour ton aide qui peut être utile pour les autres utilisateurs.

Bonsoir,

A-priori rien d'autre qu'une banale recherche... mais pour chercher, il faut chercher quelque part, donc sans fichier on ne commence même pas !

MFerrand a écrit :

Bonsoir,

A-priori rien d'autre qu'une banale recherche... mais pour chercher, il faut chercher quelque part, donc sans fichier on ne commence même pas !

Bonjour,

Ci-joint le fichier.

FunkyFlok

Bonjour,

Si je comprends bien, c'est ta procédure sous le bouton Démarrer qui est en cause ?

MFerrand a écrit :

Bonjour,

Si je comprends bien, c'est ta procédure sous le bouton Démarrer qui est en cause ?

Voila, en gros dans la feuille "Histo" j'ai tous les produits.

Dans ma feuille inventaire je vais lister chaque inventaire de chaque produit que je vais faire, mais si par exemple on note un inventaire passé à la suite je veux quand même que à l'aide du bouton on puisse retrouver la dernière date de l'inventaire du produit en question.

C'est à dire la date la plus récente par rapport à aujourd'hui

Si Produit 1 : 15/05/2016

P2 : 23/06/2016

P3 : 10/03/2016

Que j'ai la date du P2 qui s'affiche.

Merci a toi pour ton aide et ton temps,

FunkyFlok

ReBonjour,

Private Sub CommandButton1_Click()
    Dim invnt, TR(), cart, n%, i%, j%, k%
    With Worksheets("Inventaire")
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        invnt = .Range("B3:C" & n).Value
    End With
    ReDim TR(1 To 2)
    For i = 1 To UBound(invnt, 1) - 1
        For j = i + 1 To UBound(invnt, 1)
            If invnt(j, 2) < invnt(i, 2) Then
                For k = 1 To 2
                    TR(k) = invnt(j, k): invnt(j, k) = invnt(i, k): invnt(i, k) = TR(k)
                Next k
            End If
        Next j
    Next i
   For i = 1 To UBound(invnt, 1)
        invnt(i, 1) = CDate(invnt(i, 1))
    Next i
    With Worksheets("Histo")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Range("A2:D" & n).Sort key1:=.Range("A2"), order1:=xlAscending, Header:=xlNo
        ReDim TR(1 To n - 1, 1 To 2)
        For i = 2 To n
            TR(i - 1, 1) = .Cells(i, 1)
        Next i
    End With
    j = 0
    For i = 1 To UBound(invnt, 1)
        cart = invnt(i, 2)
        Do
            j = j + 1
            If TR(j, 1) = cart Then
                TR(j, 2) = 1: TR(j, 1) = invnt(i, 1)
                If i = UBound(invnt, 1) Then Exit For
                Do
                    If invnt(i + 1, 2) = cart Then
                        If invnt(i + 1, 1) > TR(j, 1) Then TR(j, 1) = invnt(i + 1, 1)
                        TR(j, 2) = TR(j, 2) + 1: i = i + 1
                    Else
                        Exit Do
                    End If
                Loop While i < UBound(invnt, 1)
                Exit Do
            Else
                TR(j, 1) = Empty
            End If
        Loop While j + 1 < n
    Next i
    If j < n - 1 Then
        For i = j + 1 To n - 1
            TR(i, 1) = Empty
        Next i
    End If
    Worksheets("Histo").Range("C2:D" & n).Value = TR
End Sub

Voilà ! Elle est a-priori fonctionnelle, mais il sera bon de la tester sur un échantillon plus important, car faire varier les indices en cours de boucles n'est pas sans risque...

Un petit souci qui m'a obligé à rajouté la partie surlignée pour convertir en dates tes dates de la feuille inventaire qui sont en fait du texte (tu peux le voir en supprimant le centrage, elles se cadrent à gauche au lieu de se cadrer à droite, et le format de cellule est standard alors que ce devrait être un format de date).

Il faudra que tu affectes la date issue de ta TextBox également avec CDate pour avoir une date dans l'inventaire...

La procédure d'effacement devient inutile, la méthode utilisée réaffecte l'ensemble de la plage Histo à partir d'un tableau, les anciennes valeurs disparaissent simultanément si elles sont caduques.

Cordialement.


NB: Les boucles imbriquées qui précèdent la partie surlignée constituent un tri du tableau prélevé sur Inventaire. On ne touche donc pas aux données de la feuille, on trie les données prélevées ensuite sur le code article.

Par contre, le tri de ta feuille Histo est fait sur le code article avant prélèvement dudit code (elle était déjà triée ainsi, mais c'est une sécurité en cas d'ajouts d'articles...)

Cela permet de suivre en parallèle la comparaison des codes articles sur les 2 tableaux sans revenir en arrière : on défile les codes sur le tableau Inventaire, à chaque code, on le recherche dans le tableau Résultat, on le sert, et on teste si les codes suivants du tableau inventaire concernent le m^me code de façon à mettre à jour les résultats successifs (nombre et date), en incrémentant l'indice du tableau inventaire pour ne pas revenir sur le même code. Sur le tableau résultats, lorsqu'il n'y a pas d'inventaire pour un code (donc pas de date qui le remplace, on l'efface, ce qui permet d'avoir à la fin un tableau exactement dimansionné à la plage...

MFerrand a écrit :

ReBonjour,

Private Sub CommandButton1_Click()
    Dim invnt, TR(), cart, n%, i%, j%, k%
    With Worksheets("Inventaire")
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        invnt = .Range("B3:C" & n).Value
    End With
    ReDim TR(1 To 2)
    For i = 1 To UBound(invnt, 1) - 1
        For j = i + 1 To UBound(invnt, 1)
            If invnt(j, 2) < invnt(i, 2) Then
                For k = 1 To 2
                    TR(k) = invnt(j, k): invnt(j, k) = invnt(i, k): invnt(i, k) = TR(k)
                Next k
            End If
        Next j
    Next i
   For i = 1 To UBound(invnt, 1)
        invnt(i, 1) = CDate(invnt(i, 1))
    Next i
    With Worksheets("Histo")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Range("A2:D" & n).Sort key1:=.Range("A2"), order1:=xlAscending, Header:=xlNo
        ReDim TR(1 To n - 1, 1 To 2)
        For i = 2 To n
            TR(i - 1, 1) = .Cells(i, 1)
        Next i
    End With
    j = 0
    For i = 1 To UBound(invnt, 1)
        cart = invnt(i, 2)
        Do
            j = j + 1
            If TR(j, 1) = cart Then
                TR(j, 2) = 1: TR(j, 1) = invnt(i, 1)
                If i = UBound(invnt, 1) Then Exit For
                Do
                    If invnt(i + 1, 2) = cart Then
                        If invnt(i + 1, 1) > TR(j, 1) Then TR(j, 1) = invnt(i + 1, 1)
                        TR(j, 2) = TR(j, 2) + 1: i = i + 1
                    Else
                        Exit Do
                    End If
                Loop While i < UBound(invnt, 1)
                Exit Do
            Else
                TR(j, 1) = Empty
            End If
        Loop While j + 1 < n
    Next i
    If j < n - 1 Then
        For i = j + 1 To n - 1
            TR(i, 1) = Empty
        Next i
    End If
    Worksheets("Histo").Range("C2:D" & n).Value = TR
End Sub

Voilà ! Elle est a-priori fonctionnelle, mais il sera bon de la tester sur un échantillon plus important, car faire varier les indices en cours de boucles n'est pas sans risque...

Un petit souci qui m'a obligé à rajouté la partie surlignée pour convertir en dates tes dates de la feuille inventaire qui sont en fait du texte (tu peux le voir en supprimant le centrage, elles se cadrent à gauche au lieu de se cadrer à droite, et le format de cellule est standard alors que ce devrait être un format de date).

Il faudra que tu affectes la date issue de ta TextBox également avec CDate pour avoir une date dans l'inventaire...

La procédure d'effacement devient inutile, la méthode utilisée réaffecte l'ensemble de la plage Histo à partir d'un tableau, les anciennes valeurs disparaissent simultanément si elles sont caduques.

Cordialement.


NB: Les boucles imbriquées qui précèdent la partie surlignée constituent un tri du tableau prélevé sur Inventaire. On ne touche donc pas aux données de la feuille, on trie les données prélevées ensuite sur le code article.

Par contre, le tri de ta feuille Histo est fait sur le code article avant prélèvement dudit code (elle était déjà triée ainsi, mais c'est une sécurité en cas d'ajouts d'articles...)

Cela permet de suivre en parallèle la comparaison des codes articles sur les 2 tableaux sans revenir en arrière : on défile les codes sur le tableau Inventaire, à chaque code, on le recherche dans le tableau Résultat, on le sert, et on teste si les codes suivants du tableau inventaire concernent le m^me code de façon à mettre à jour les résultats successifs (nombre et date), en incrémentant l'indice du tableau inventaire pour ne pas revenir sur le même code. Sur le tableau résultats, lorsqu'il n'y a pas d'inventaire pour un code (donc pas de date qui le remplace, on l'efface, ce qui permet d'avoir à la fin un tableau exactement dimansionné à la plage...

Bonjour a toi !

C'est exactement ce que je souhaitais, et le fait de pouvoir rafraîchir les données seulement en rappuyant sur le bouton démarrer c'est une excellente idée car ça permet de diminuer le nombre de boutons et d'actions lors de l'utilisation.

Un grand merci pour ta disponibilité et ton aide claire qui me permet de comprendre les étapes à suivre.

Et bonjour à tous les Réunionnais au passage !

FunkyFlok

Rechercher des sujets similaires à "recuperer date recente"