Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Dernière cellule non vide - retour date

Michel_ja

XLDnaute Occasionnel
Bonjour à tous.
En fouillant un peur sur le forum j'ai trouvé une solution pour trouver la première cellule différente de 0 sur une ligne. Mon besoin est l'inverse, j'ai un fichier avec des lignes de produits et en colonnes j'ai des dates mensuelles et je souhaiterai savoir à quelle date tel ou tel produit a réalisé sa dernière vente. L'objectif est de corriger une cellule qui prédisait que le produit ne vendrait plus passé cette date.
J'ai joint un extrait du fichier. En Col L, j'ai des dates qui prédisait donc que le véhicule aaaaa (Cellule E2) ne serait plus vendu après le 30/08/2018. Hors il y a des ventes jusqu'en avril 2019 (Cellule BM2). Pourrait-on avoir en cellule BV2 une fonction qui me renverrai la date 30/04/2019 ?

Je vous remercie par avance.
Michel
 

Pièces jointes

  • Essai Date dernière vente.xlsx
    16 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour Michel_ja, le forum,

Formule matricielle en BV2 du fichier joint :
Code:
=SI(SOMME(N2:BU2);INDEX(A$1:BU$1;MAX(SI(N2:BU2<>0;COLONNE(N2:BU2))));"")
A valider par Ctrl+Maj+Entrée et tirer vers le bas.

Bonne journée.
 

Pièces jointes

  • Essai Date dernière vente(1).xlsx
    16 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Michel_ja, @job75 ,

Un peu différent de la solution de job75.

Tout d'abord, on a transformé les date de la ligne 1 en véritable date au sens Excel.
  • pour cela on a placé la date 31/01/2015 dans la cellule N1
  • dans la cellule O1, on a placé la formule =FIN.MOIS(N1;1) qu'on a recopiée vers la droite
Dans la cellule BV2, on a placé la formule suivante puis on a recopier cette formule matricielle vers le bas:
VB:
=SIERREUR(SI(INDEX($1:$1;GRANDE.VALEUR(SI(N2:BU2>0;COLONNE(N2:BU2);"");1))>L2;INDEX($1:$1;GRANDE.VALEUR(SI(N2:BU2>0;COLONNE(N2:BU2);"");1));"");"")

Les cellules de la colonne BV contiennent des véritables dates.
 

Pièces jointes

  • Michel_ja- Essai Date dernière vente- v1.xlsx
    16.8 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour mapomme,

Tout à fait d'accord pour utiliser de vraies dates, mais Michel_ja a peut-être de bonnes raisons pour utiliser des dates sous forme de textes, en anglais de surcroît.

On peut alors utiliser cette macro évènementielle pour les créer :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim deb As Range, a, P As Range, tablo, resu$(), i%
Set deb = [N1] '1ère date
If Not IsDate(deb) Then Exit Sub
a = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
Set P = deb.Resize(, Cells(deb.Row, Columns.Count).End(xlToLeft).Column - deb.Column)
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next 'sécurité
deb = DateSerial(Year(deb), Month(deb) + 1, 0) 'fin de mois
P(2).Resize(, P.Columns.Count - 1) = "=EOMONTH(RC[-1],1)" 'fonction FIN.MOIS
ThisWorkbook.Names.Add "MesDates", P.Value2 'nom défini sur une matrice
tablo = [MesDates] 'matrice, plus rapide
ReDim resu(1 To UBound(tablo))
For i = 1 To UBound(tablo)
    resu(i) = "'" & a(Month(tablo(i)) - 1) & " " & Year(tablo(i)) 'textes
Next
P = resu 'restitution
Application.EnableEvents = True 'réactive les évènements
End Sub
Edit : le tableau resu est nécessaire.

Avec le nom défini MesDates créé la formule matricielle en BV2 renvoie une vraie date :
Code:
=SI(SOMME(N2:BU2);INDEX(MesDates;MAX(SI(N2:BU2<>0;COLONNE(N2:BU2))-COLONNE(N2)+1));"")
Fichier .xlsm joint.

A+
 

Pièces jointes

  • Essai Date dernière vente(1).xlsm
    26 KB · Affichages: 4
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…