IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[FAQ] Pour trouver le Minimum ou le Maximum


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut [FAQ] Pour trouver le Minimum ou le Maximum
    Bonjour,

    Ces deux fonctions restituent le minimum ou le maximum d’une série de données, quel que soit leur nombre (illimité) et quel que soit leur type (date, numérique ou texte) pourvu qu’elles soient homogènes.
    La série de données est présentée sous forme de texte, donc encadrée de quotes. Les composants sont séparés entre eux par un "PaillePeu" "|" = <alt> + 124
    Pour le minimum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Public Function LeMinimum(Série) As Variant
     'valeurs entre quotes et séparées par |
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     
     'ex d'appels :  LeMinimum("31/12/09|25/3/2003|1/1/07")
     '               LeMinimum("1000|4|5|3,1416")
     '               LeMinimum("abc|d|efg|h|a|bcd")
     '               LeMinimum("1000|abc|5|3,1416") conduit à une erreur
     '               LeMinimum("31/12/09|A|1/1/07") conduit à une erreur
     '               LeMinimum("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer
     
    ArrSérie = Split(Série, "|")
    LeMinimum = ArrSérie(0)
    If IsDate(LeMinimum) Then   'comparaison de dates
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsDate(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus petit
     For i = 1 To UBound(ArrSérie)
       If Format(ArrSérie(i), "yymmdd") < Format(LeMinimum, "yymmdd") Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    Exit Function
    ElseIf IsNumeric(LeMinimum) Then    'comparaison autre
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus petit
     
     For i = 1 To UBound(ArrSérie)
       If CDbl(ArrSérie(i)) < CDbl(LeMinimum) Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    Exit Function
    Else
     For i = 1 To UBound(ArrSérie)
       If ArrSérie(i) < LeMinimum Then
          LeMinimum = ArrSérie(i)
       End If
     Next i
    End If
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
     
    End Function

    Pour le maximum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Public Function LeMaximum(Série) As Variant
     'valeurs entre quotes et séparées par |
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     
     'ex d'appels :  LeMaximum("31/12/09|25/3/2003|1/1/07")
     '               LeMaximum("1000|4|5|3,1416")
     '               LeMaximum("abc|d|efg|h|a|bcd")
     '               LeMaximum("1000|abc|5|3,1416") conduit à une erreur
     '               LeMaximum("31/12/09|A|1/1/07") conduit à une erreur '               LeMaximum("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer
     
    ArrSérie = Split(Série, "|")
    LeMaximum = ArrSérie(0)
    If IsDate(LeMaximum) Then   'comparaison de dates
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsDate(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus Grand
     For i = 1 To UBound(ArrSérie)
       If Format(ArrSérie(i), "yymmdd") > Format(LeMaximum, "yymmdd") Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    Exit Function
    ElseIf IsNumeric(LeMaximum) Then 'comparaison autre
     'vérifier homogénéité
     For i = 1 To UBound(ArrSérie)
       If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
     Next i
     'Rechercher le plus Grand
     For i = 1 To UBound(ArrSérie)
       If CDbl(ArrSérie(i)) > CDbl(LeMaximum) Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    Exit Function
    Else
     For i = 1 To UBound(ArrSérie)
       If ArrSérie(i) > LeMaximum Then
          LeMaximum = ArrSérie(i)
       End If
     Next i
    End If
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
     
    End Function
    Exemple d'utilisation dans une requête
    sur "DatesAcomparer" pour les champs date1, date2, date3 et date4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DatesAcomparer.date1, DatesAcomparer.date2, DatesAcomparer.date3, DatesAcomparer.date4, LeMinimum([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS [Min], LeMaximum([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS [Max]
    FROM DatesAcomparer;

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 673
    Points : 34 387
    Points
    34 387
    Par défaut
    salut,
    une bien belle utilisation de la fonction Split()

    Puis-je te proposer de code sur le meme modele le tri croissant et décroissant ?

    Dans quel cadre as-tu eu l'occasion de mettre en place cette fonction ?

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour jpcheck,

    Quelques jours de vacances expliquent ma réponse tardive.


    Puis-je te proposer de code sur le meme modele le tri croissant et décroissant ?
    Je ne comprends pas la question.
    S'agit-il de trier la série et la restituer présentée dans l'ordre croissant ?
    Dans quel cadre as-tu eu l'occasion de mettre en place cette fonction ?
    La question d'un visiteur.
    http://www.developpez.net/forums/d96...sieurs-champs/

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 673
    Points : 34 387
    Points
    34 387
    Par défaut
    Salut,
    exactement, il s'agit de trier dans l'ordre souhaite les valeurs de ta serie.

    Tri a bulle ou autre algorithme possible

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    ReBonjour jpcheck,

    Une variante sous forme de couteau suisse.
    Pour le même prix, au choix : l'ordre croissant, décroissant, le Max ou le Min.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Public Function TriABulle(Série As String, Optional ChoixRésultat As String = "Croissant")
    ' Tri à bulle --->http://lwh.free.fr/pages/algo/tri/tri_bulle.htm
     
     '1er paramètre
     '-------------
     'valeurs entre quotes et séparées par |, "PaillePeu ou pipe" = <alt> + 124
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     '2ème paramètre :
     '--------------
     '  "Croissant" (par défaut) la fonction renvoie la série dans l'ordre croissant
     '  "Décroissant" la fonction renvoie la série dans l'ordre décroissant
     '  "Max" la fonction renvoie le maximum dans la série
     '  "Min" la fonction renvoie le minimum dans la série
     'ex d'appels :  TriABulle("31/12/09|25/3/2003|1/1/07","Décroissant")
     '-----------    TriABulle("1000|4|5|3,1416") ---> ordre croissant
     '               TriABulle("abc|d|efg|h|a|bcd","Max")
     '               TriABulle("1000|abc|5|3,1416") conduit à une erreur
     '               TriABulle("31/12/09|A|1/1/07") conduit à une erreur
     '               TriABulle("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer, Permuté As Boolean, Tampon As Variant
     
    ArrSérie = Split(Série, "|")
    Permuté = True
    If IsDate(ArrSérie(0)) Then   'comparaison de dates
     'vérifier homogénéité
       For i = 1 To UBound(ArrSérie)
           If Not IsDate(ArrSérie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permuté = True
           Permuté = False
             For i = 0 To UBound(ArrSérie) - 1
                   If Format(ArrSérie(i), "yymmdd") > Format(ArrSérie(i + 1), "yymmdd") Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
    ElseIf IsNumeric(ArrSérie(0)) Then   'comparaison de numériques
     'vérifier homogénéité
       For i = 1 To UBound(ArrSérie)
           If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permuté = True
           Permuté = False
             For i = 0 To UBound(ArrSérie) - 1
                   If CDbl(ArrSérie(i)) > CDbl(ArrSérie(i + 1)) Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
    Else     ' comparaison texte
       Do While Permuté = True
           Permuté = False
             For i = 0 To UBound(ArrSérie) - 1
                   If ArrSérie(i) > ArrSérie(i + 1) Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
     
    End If
     
    AménagerRésultat:
    Select Case ChoixRésultat
    Case "Croissant"
       For i = 0 To UBound(ArrSérie)
         TriABulle = TriABulle & ArrSérie(i) & "|"
       Next i
       TriABulle = Left(TriABulle, Len(TriABulle) - 1)
    Case "Décroissant"
       For i = UBound(ArrSérie) To 0 Step -1
         TriABulle = TriABulle & ArrSérie(i) & "|"
       Next i
       TriABulle = Left(TriABulle, Len(TriABulle) - 1)
    Case "Max"
       TriABulle = ArrSérie(UBound(ArrSérie))
    Case "Min"
       TriABulle = ArrSérie(0)
    Case Else
       MsgBox "Ce paramètre de choix n'est pas prévu", vbCritical
       Exit Function
     
    End Select
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
    End Function
    Exemple d'utilisation dans une requête
    sur "DatesAcomparer" pour les champs date1, date2, date3 et date4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DatesAcomparer.date1, DatesAcomparer.date2, DatesAcomparer.date3, DatesAcomparer.date4, TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Min") AS [Min], TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Max") AS [Max], TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Décroissant") AS Décroissant, TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS Croissant
    FROM DatesAcomparer;

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut Un léger + : 1 seul paramètre et un choix de résultat
    Bonsoir
    Une variante de la précédente.
    Le résultat de la fonction est un type défini par l'utilisateur.
    (à copier en début de module)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Type ResultatTri
        Min As Variant
        Max As Variant
        Asc As String
        Desc As String
    End Type
    Type Variant pour Min et Max, car on ne connaît pas le type a priori.

    La syntaxe d’appel devient

    Tri("31/12/09|25/3/2003|1/1/07").asc
    Tri("1000|4|5|3,1416").desc
    Tri("abc|d|efg|h|a|bcd").max
    Tri("abc|d|efg|h|a|bcd").min

    L’avantage : 1 seul argument (la série à trier) et Access suggère les valeurs possibles des choix du résultat.

    La fonction devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Public Function Tri(Serie As String) As ResultatTri
    ' Tri à bulle --->http://lwh.free.fr/pages/algo/tri/tri_bulle.htm
     
     ' paramètre
     '-------------
     'valeurs entre quotes et séparées par |, "PaillePeu ou pipe" = <alt> + 124
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
      'ex d'appels : Tri("31/12/09|25/3/2003|1/1/07").asc
     '-----------    Tri("1000|4|5|3,1416").desc
     '               Tri("abc|d|efg|h|a|bcd").max
     '               Tri("1000|abc|5|3,1416").min ---> conduit à une erreur
     '               Tri("31/12/09|A|1/1/07").min ---> conduit à une erreur
     '               Tri("a|abc|31/12/07|3,1416").asc   sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSerie() As String, i As Integer, Permute As Boolean, Tampon As Variant
     
    ArrSerie = Split(Serie, "|")
    Permute = True
    If IsDate(ArrSerie(0)) Then   'comparaison de dates
     'vérifier homogénéité
       For i = 1 To UBound(ArrSerie)
           If Not IsDate(ArrSerie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permute = True
           Permute = False
             For i = 0 To UBound(ArrSerie) - 1
                   If Format(ArrSerie(i), "yymmdd") > Format(ArrSerie(i + 1), "yymmdd") Then
                        Tampon = ArrSerie(i + 1)
                        ArrSerie(i + 1) = ArrSerie(i)
                        ArrSerie(i) = Tampon
                        Permute = True
                   End If
             Next i
        Loop
    ElseIf IsNumeric(ArrSerie(0)) Then   'comparaison de numériques
     'vérifier homogénéité
       For i = 1 To UBound(ArrSerie)
           If Not IsNumeric(ArrSerie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permute = True
           Permute = False
             For i = 0 To UBound(ArrSerie) - 1
                   If CDbl(ArrSerie(i)) > CDbl(ArrSerie(i + 1)) Then
                        Tampon = ArrSerie(i + 1)
                        ArrSerie(i + 1) = ArrSerie(i)
                        ArrSerie(i) = Tampon
                        Permute = True
                   End If
             Next i
        Loop
    Else     ' comparaison texte
       Do While Permute = True
           Permute = False
             For i = 0 To UBound(ArrSerie) - 1
                   If ArrSerie(i) > ArrSerie(i + 1) Then
                        Tampon = ArrSerie(i + 1)
                        ArrSerie(i + 1) = ArrSerie(i)
                        ArrSerie(i) = Tampon
                        Permute = True
                   End If
             Next i
        Loop
     
    End If
    'AmenagerResultat:
    'Croissant
       For i = 0 To UBound(ArrSerie)
         Tri.Asc = Tri.Asc & ArrSerie(i) & "|"
       Next i
       Tri.Asc = Left(Tri.Asc, Len(Tri.Asc) - 1)
    'Décroissant
       For i = UBound(ArrSerie) To 0 Step -1
         Tri.Desc = Tri.Desc & ArrSerie(i) & "|"
       Next i
       Tri.Desc = Left(Tri.Desc, Len(Tri.Desc) - 1)
    'Max
       Tri.Max = ArrSerie(UBound(ArrSerie))
    'Min
       Tri.Min = ArrSerie(0)
    Exit Function
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
    End Function

    Merci déjà pour remarques et suggestions.

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 927
    Points : 58 513
    Points
    58 513
    Billets dans le blog
    46
    Par défaut
    bonjour Claude,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DatesAcomparer.date1, DatesAcomparer.date2, DatesAcomparer.date3, DatesAcomparer.date4, TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Min") AS [Min], TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Max") AS [Max], TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4],"Décroissant") AS Décroissant, TriABulle([date1] & "|" & [date2] & "|" & [date3] & "|" & [date4]) AS Croissant
    FROM DatesAcomparer;
    Comment faire pour trouver le mini/maxi si dans la série de dates, il y en a qui sont à Null ?
    Actuellement on a le message "les données ne sont pas homogènes"

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 673
    Points : 34 387
    Points
    34 387
    Par défaut
    Hello,

    si tu nous dis si tu veux voir les dates à Null en début ou en fin de classement

    Il s'agira de mettre des valeurs par défaut (haute ou basse) en passant par exemple par la fonction Nz()

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 927
    Points : 58 513
    Points
    58 513
    Billets dans le blog
    46
    Par défaut
    salut jpcheck,

    je verrais bien les nulls éliminés.

    Par exemple,
    Date1: Null
    Date2: 01/01/2010
    Date3: 01/01/2011
    Date4: Null

    le min ==>01/01/2010
    le max ==>01/01/2011

    j'avais bien pensé à remplacer les valeurs Null avec des valeurs par défaut avec Nz, mais si accidentellement j'ai:
    Date1: Null
    Date2: Null
    Date3: Null
    Date4: Null

    je souhaite un résultat à Null et non pas un maxi à 31/12/2999 ou un mini à 01/01/1799

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 673
    Points : 34 387
    Points
    34 387
    Par défaut
    Il s'agirait ici d'adapter en conséquence la partie finale du code d'une part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Croissant
       For i = 0 To UBound(ArrSerie)  
       Tri.Asc = Tri.Asc & ArrSerie(i) & "|"
       Next i
       Tri.Asc = Left(Tri.Asc, Len(Tri.Asc) - 1)
    'Décroissant
       For i = UBound(ArrSerie) To 0 Step -1
         Tri.Desc = Tri.Desc & ArrSerie(i) & "|"
       Next i
       Tri.Desc = Left(Tri.Desc, Len(Tri.Desc) - 1)
    'Max
       Tri.Max = ArrSerie(UBound(ArrSerie))
    'Min
       Tri.Min = ArrSerie(0)
    et de mettre des valeurs "fake" à évacuer du filtre

    test du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ArrSerie(i)<>valeursiNull Then

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonsoir Fabien,

    Content de te croiser.

    Je n’avais pas prévu ce cas.
    Je cherche une solution pour ne pas tenir compte des arguments vides ou à valeur null.
    Je te reviens dès que j’ai trouvé.

    À+

  12. #12
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Voici.
    J’ai modifié la fonction « TriABulle » comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    Public Function TriABulle(Série As String, Optional ChoixRésultat As String = "Croissant")
    ' Tri à bulle --->http://lwh.free.fr/pages/algo/tri/tri_bulle.htm
     
     '1er paramètre
     '-------------
     'valeurs entre quotes et séparées par |, "PaillePeu ou pipe" = <alt> + 124
     'les nombres décimaux avec virgule.
     'le premier membre détermine le type de données (date, numérique ou texte)
     '2e paramètre :
     '--------------
     '  "Croissant" (par défaut) la fonction renvoie la série dans l'ordre croissant
     '  "Décroissant" la fonction renvoie la série dans l'ordre décroissant
     '  "Max" la fonction renvoie le maximum dans la série
     '  "Min" la fonction renvoie le minimum dans la série
     'ex d'appels :  TriABulle("31/12/09|25/3/2003|1/1/07","Décroissant")
     '-----------    TriABulle("1000|4|5|3,1416") ---> ordre croissant
     '               TriABulle("abc|d|efg|h|a|bcd","Max")
     '               TriABulle("1000|abc|5|3,1416") conduit à une erreur
     '               TriABulle("31/12/09|A|1/1/07") conduit à une erreur
     '               TriABulle("a|abc|31/12/07|3,1416")sera accepté, _
                       mais les dates et nombres seront traités comme du texte
     
    On Error GoTo erreur
    Dim ArrSérie() As String, i As Integer, Permuté As Boolean, Tampon As Variant, j As Integer
     
    ArrSérie = Split(Série, "|")
    '---------------
    'Placer les valeurs null à la fin
       For i = 0 To UBound(ArrSérie)
           If Nz(ArrSérie(i), "") = "" Then
                For j = i To UBound(ArrSérie) - 1
                  ArrSérie(j) = ArrSérie(j + 1)
                Next j
                ArrSérie(UBound(ArrSérie)) = "|HorsTri|"
                i = i - 1
           End If
       Next i
     
    'Compter les éléments valides à trier
     For j = 0 To UBound(ArrSérie)
        If ArrSérie(j) = "|HorsTri|" Then Exit For
     Next j
     'J contient le nbre d'arguments valides
     
     If j = 0 Then
        MsgBox "Il n'y a rien à trier !"
        Exit Function
     End If
     
    '---------------
    Permuté = True
    If IsDate(ArrSérie(0)) Then   'comparaison de dates
     'vérifier homogénéité
       For i = 1 To j - 1 ''''''''''''''''''''''''UBound(ArrSérie)
           If Not IsDate(ArrSérie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permuté = True
           Permuté = False
             For i = 0 To j - 1 - 1 '''''''''''''''''''''''''''''''''''''UBound(ArrSérie) - 1
                   If Format(ArrSérie(i), "yymmdd") > Format(ArrSérie(i + 1), "yymmdd") Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
    ElseIf IsNumeric(ArrSérie(0)) Then   'comparaison de numériques
     'vérifier homogénéité
       For i = 1 To j - 1             '''''''''''''''''UBound(ArrSérie)
           If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
       Next i
     'classer en ordre croissant par permutations successives
       Do While Permuté = True
           Permuté = False
             For i = 0 To j - 1 - 1 '''''''''''''''''''''''''''''''''''''UBound(ArrSérie) - 1
                   If CDbl(ArrSérie(i)) > CDbl(ArrSérie(i + 1)) Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
    Else     ' comparaison texte
       Do While Permuté = True
           Permuté = False
             For i = 0 To j - 1 - 1 '''''''''''''''''''''''''''''''''''''UBound(ArrSérie) - 1
                   If ArrSérie(i) > ArrSérie(i + 1) Then
                        Tampon = ArrSérie(i + 1)
                        ArrSérie(i + 1) = ArrSérie(i)
                        ArrSérie(i) = Tampon
                        Permuté = True
                   End If
             Next i
        Loop
     
    End If
     
    AménagerRésultat:
    Select Case ChoixRésultat
    Case "Croissant"
       For i = 0 To j - 1  '''''''''''''''''''''''''''''''''''''UBound(ArrSérie) - 1
         TriABulle = TriABulle & ArrSérie(i) & "|"
       Next i
       TriABulle = Left(TriABulle, Len(TriABulle) - 1)
    Case "Décroissant"
       For i = j - 1 To 0 Step -1          'UBound(ArrSérie) To 0 Step -1
         TriABulle = TriABulle & ArrSérie(i) & "|"
       Next i
       TriABulle = Left(TriABulle, Len(TriABulle) - 1)
    Case "Max"
       TriABulle = ArrSérie(j - 1) '''''''''''''''''ArrSérie(UBound(ArrSérie))
    Case "Min"
       TriABulle = ArrSérie(0)
    Case Else
       MsgBox "Ce paramètre de choix n'est pas prévu", vbCritical
       Exit Function
     
    End Select
    Exit Function
     
    erreur:
    MsgBox "les données ne sont pas homogènes", vbCritical
    End Function
    J’ai laissé volontairement les marques des modifs (sous forme de commentaires).

    Vois si cette nouvelle version te donne le résultat que tu attends.
    Si oui, je ferai la toilette du code et je modifierai la fonction « Tri » dans le même sens.

    Bien à toi.

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 927
    Points : 58 513
    Points
    58 513
    Billets dans le blog
    46
    Par défaut
    Bonsoir Claude,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Placer les valeurs null à la fin
    bonne idée

    c'est parfait, merci à toi pour ton aide et plus généralement pour ta grande disponibilité et tes contributions très appréciés chez les forumeurs.

    A la prochaine...

    Fabien

  14. #14
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Une question : serait-il possible d'utiliser ParamArray avec un nombre d'arguments variable plutôt que split sur une chaîne (en mettant le sens de tri en premier argument) ?
    Je ne sais pas si c'est possible dans le VBA utilisé directement dans une requête.

  15. #15
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 673
    Points : 34 387
    Points
    34 387
    Par défaut
    L'avantage du split sur une chaîne c'est que justement tu peux avoir un nombre de paramètres variables

    Au lieu d'avoir tout plein de Optional ArgX :p

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64

    Informations forums :
    Inscription : Octobre 2004
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci pour toute cette débauche d'énergie !

    Je teste tout ça et vous tiens au courant

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    Avec ParamArray pour obtenir le maximum et minimum d'une série.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Function getMax(ParamArray pa() As Variant) As Variant
       Dim v As Variant
       For Each v In pa
          If v > getMax Then getMax = v
       Next v
    End Function
     
    Public Function getMin(ParamArray pa() As Variant) As Variant
       Dim v As Variant
       For Each v In pa
          If v < getMin Then
            getMin = v
          ElseIf IsEmpty(getMin) And Not IsNull(v) Then
            getMin = v
          End If
       Next v
    End Function
    Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Function TestMinMax()
       Debug.Print getMax(Null, 0, Null, -9, 5, Null)
       Debug.Print getMin(Null, 0, Null, -9, 5, Null)
       Debug.Print getMax(Null, "abc", "d", Null, "efg", "h", "a", "bcd", Null)
       Debug.Print getMin(Null, "abc", "d", Null, "efg", "h", "a", "bcd", Null)
    End Function
    Philippe

Discussions similaires

  1. Commande pour trouver la version de Linux
    Par Gogoye dans le forum Administration système
    Réponses: 11
    Dernier message: 12/02/2013, 16h43
  2. Dichotomie pour trouver le minimum d'une fonction
    Par justin0203 dans le forum MATLAB
    Réponses: 4
    Dernier message: 16/01/2012, 13h20
  3. je recherche une fonction pour trouver le minimum
    Par laxe13 dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2008, 01h55
  4. Trouver le minimum ou le maximum sur une courbe
    Par neoscanx dans le forum MATLAB
    Réponses: 8
    Dernier message: 22/05/2007, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo