Trouver la plus petite valeur de ligne en omettant certaines donées

Voilà, mes données sont entrées sous le format suivant : FJO 2018-11-12 . J'aimerais pouvoir écrire automatiquement dans une cellule au bout de la ligne la date la moins élevée de cette ligne, il faudrait donc omettre le FJO. Est-ce possible?

Bonjour Frederic,

En A1 : FJO 2018-11-12

juste 3 pistes :

=DROITE(A1;10)2018-11-12 (date texte année-mois-jour)

=DROITE(A1;2) & "/" & STXT(A1;10;2) & "/" & STXT(A1;5;4)12/11/2018 (date texte jour/mois/année)

=DATE(STXT(A1;5;4);STXT(A1;10;2);DROITE(A1;2))12/11/2018 (vraie date jour/mois/année)

faudrait utiliser la 3ème formule pour comparer les valeurs de date et prendre la plus petite.

dhany

comme dans cette exemple (fichier en PJ) ce serait possible comment?

3exemple-1.xlsx (8.56 Ko)

ton fichier modifié :

7exemple-1.xlsx (9.49 Ko)

dhany

donc pour un fichier différent avec des lignes plus longues, je n'ai qu'a changer les plages A1:d1 ?

7exemple-1-1.xlsx (10.24 Ko)

c'est beaucoup moins simple que ça !

* tes données n'ont pas toutes le même format que celui que tu as indiqué au départ

* tu as même des cellules où y'a 2 éléments en même temps ; exemple :

en J6 :

TOP FSG 2018-11-07

BOT FJO 2018-11-08

* tu as des cellules vides

peut-être qu'un pro des formules arrivera à trouver une solution ?

moi, j'essayerai plutôt avec une macro, mais j'suis débordé !

je laisse la suite à un autre intervenant.

bonne chance !

dhany

Merci beaucoup de ton aide!

Salut Frederic,

salut Dhany,

une fonction personnalisée...

En bout de ligne :

=fctDate(LIGNE();COLONNE())

Le code, en Module1 :

Public Function fctDate(ByVal iRow%, iCol%) As Date
'
Dim tData, tSplit
Dim dDate1 As Date, dDate2 As Date
'
Application.Volatile
dDate1 = "1/1/2500"
tData = Range("B" & iRow).Resize(1, iCol - 2).Value
For x = 1 To UBound(tData, 2)
    If tData(1, x) <> "" Then
        tSplit = Split(tData(1, x), " ")
        If IsDate(tSplit(UBound(tSplit))) Then
            dDate2 = CDate(tSplit(UBound(tSplit)))
            dDate1 = IIf(dDate2 < dDate1, dDate2, dDate1)
        End If
    End If
Next
fctDate = dDate1
'
End Function

A+

4fctdate.xlsm (16.53 Ko)

Bonjour,

Comme tu as plusieurs dates dans la même cellule, il faut boucler dans celle-ci pour en extraire la date la plus faible. J'ai utilisé Right() et Left() pour extraire l'année et le jour à cause des retours à la ligne (les lettres étant concaténées au chiffres).

Appel de la fonction pour la 1ère ligne :

=DATEMIN(B6:Y6)

A tirer vers le bas. Fonction à mettre dans un module standard :

Function DATEMIN(Plage As Range) As Date

    Dim Cel As Range
    Dim T
    Dim I As Integer
    Dim LaDate As Date
    Dim Annee As Integer
    Dim Mois As Integer
    Dim Jour As Integer

    LaDate = CDate("01/01/3000")

    For Each Cel In Plage

        T = Split(Cel.Value, " ")

        For I = 0 To UBound(T)

            If InStr(T(I), "-") <> 0 Then

                Annee = Right(Split(T(I), "-")(0), 4) 'extraction de l'année à cause du retour à la ligne
                Mois = Split(T(I), "-")(1)
                Jour = Left(Split(T(I), "-")(2), 2) 'extraction du jour à cause du retour à la ligne

                If LaDate > CDate(Annee & "/" & Mois & "/" & Jour) Then
                    LaDate = CDate(Annee & "/" & Mois & "/" & Jour)
                End If

            End If

        Next I

    Next Cel

    DATEMIN = LaDate

End Function

Salut l'équipe,

heureusement que Theze a les yeux en face des trous : j'avais zappé les cellules avec deux dates!!

Code corrigé :

Public Function fctDate(ByVal iRow%, iCol%) As Date
'
Dim tData, tSplit
Dim dDate As Date
'
Application.Volatile
dDate = "1/1/2500"
tData = Range("B" & iRow).Resize(1, iCol - 2).Value
For x = 1 To UBound(tData, 2)
    If tData(1, x) <> "" Then
        For y = 0 To IIf(InStr(tData(1, x), Chr(10)) = 0, 0, 1)
            tSplit = Split(Split(tData(1, x), Chr(10))(y))
            For Z = 0 To UBound(tSplit)
                If IsDate(tSplit(Z)) Then dDate = IIf(CDate(tSplit(Z)) < dDate, CDate(tSplit(Z)), dDate)
            Next
        Next
    End If
Next
fctDate = dDate
'
End Function

ou...

Public Function fctDate(ByVal iRow%, iCol%) As Date
'
Dim tSplit, rCel As Range, dDate As Date
'
Application.Volatile
For Each rCel In Range("B" & iRow).Resize(1, iCol - 2)
    If rCel <> "" Then
        For x = 0 To IIf(InStr(rCel, Chr(10)) = 0, 0, 1)
            tSplit = Split(Split(rCel, Chr(10))(x))
            For y = 0 To UBound(tSplit)
                If IsDate(tSplit(y)) Then dDate = IIf(CDate(tSplit(y)) < IIf(dDate = 0, "1/1/2500", dDate), CDate(tSplit(y)), IIf(dDate = 0, "1/1/2500", dDate))
            Next
        Next
    End If
Next
fctDate = dDate
'
End Function

A+

salut curulis57, le forum,

tu a écrit :

heureusement que Theze a les yeux en face des trous : j'avais zappé les cellules avec deux dates!!

pour les 2 dates dans une même cellule, je l'avais bien indiqué ici :

screen

dhany

Hello

heureusement que Theze a les yeux en face des trous

Je ne suis pas seul, dhany aussi (il a probablement passé, comme moi, une bonne nuit )

Rechercher des sujets similaires à "trouver petite valeur ligne omettant certaines donees"