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
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 SubVoilà ! 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 SubVoilà ! 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