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

Macros et VBA Excel Discussion :

plus grand élément dans un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut plus grand élément dans un tableau
    Bonjour , je dois écrire une fonction qui me renvoie le plus grand élément du tableau parmi ceux qui sont strictement inférieurs à un nombre n passé en paramètres . La fonction renvoie "erreur" si il n'y a pas de plus grand élément.

    Voici mon idée d'algorithme : On déclare une variable X qui par définition est égale au 1er élément du tableau .

    Si la case du tableau contient une valeur inférieure à n Ensuite

    Si la case du tableau contient une variable plus petite que X , alors on passe à la case suivante ,
    SINON
    X est égal à la valeur de la case .
    Fin du 1er if

    SINON
    on passe à la case suivante
    FIN

    J'ai tenté d'écrire un code qui dans un 1er temps ne s'occupe pas du erreur , juste du n et de la recherche du 1er élément , mais il fonctionne pas bien , le voici :

    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
    Function plusGrand(ByVal n As Long) As Single
    Dim plage As Range
    Dim i As Integer, X As Integer
    Set plage = Range(Cells(1, 1), Cells(20, 1))
    X = plage.Cells(1, 1).Value
        For i = 2 To 20
           If plage.Cells(i, 1).Value < n Then
                If plage.Cells(i, 1).Value < X  Then
                    i = i + 1
                Else
                    X = plage.Cells(i, 1).Value
                    i = i + 1
                End If
                i = i + 1
            End If
        Next i
        plusGrand = X
    End Function
    J'ai l'impression que c'est parce que je parcours mal le tableau , qu'en pensez vous?

    Merci .

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Pourquoi tu passe par plage?
    Pourquoi tu défini X en entier alors que ta fonction est un réelle, deplus tu eux te passer du X et directement utiliser plusgrand dans ton code

    Tu n'as pas besoin de faire i=i+1 puisque next i le fait ton code saute une ligne a chaque fois (a mon avis c'est ca qui ta posé problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function plusGrand(ByVal n As Long) As Single
     
    Dim i As Integer, X As Single
    plusGrand = Cells(1, 1).Value
        For i = 2 To 20
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
        Next i
     
    End Function

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    en colonne 1 , de la ligne 13 à 19 j'ai cette série de nombres :

    8,96
    10,03
    8,16
    13,60
    7,31
    8,75
    10,24

    Voici le code de la fonction que j'ai modifié grâce à ton aide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function plusGrand(ByVal n As Integer) As single
    Dim i As Integer
    plusGrand = Cells(13, 1).Value
        For i = 14 To 19
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
        Next i
        plusGrand = Cells(i, 1).Value
    End Function
    Je l'ai testé pour n = 12 , elle devrait me renvoyer 10,24 , mais elle me renvoie à la place #VALEUR! , c'est étrange qu'en penses tu ?

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function plusGrand(ByVal n As Integer) As single
    Dim i As Integer
    plusGrand = Cells(13, 1).Value
        For i = 14 To 19
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
        Next i
    End Function
    tu faisiat ta boucle et a la fin comme ca pour rire alors que i n'a plus vraiment de valeur
    plusGrand = Cells(i, 1).Value


    enlève le et tu verra ca ira tout seul

    Pour résoudre ce genre de problème fait tourner ton code en pas a pas (touche F8) en affichant les variable local ca permet de suivre chaque modif des variables et de voir ou ca "coince"

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    ok , ça a l'air de coller , mais parfois dans l'une des cases j'ai une lettre , c'est donc une donnée de type string , je ne peux pas la comparer aux nombres , tu saurais comment faire pour ne pas tenir compte des cases qui contiennent des lettres ?

    en fait je cherche depuis tt à l'heure mais comment trouver le plus grand élément dans ce tableau ci :

    A
    A
    8,16
    13,60
    7,31
    A
    10,24

    Tu vois si on tombe sur A il faut passer à la case suivante , mais mon algo tombe à l'eau car il se base justement sur la définition d'une valeur dès le début...

  6. #6
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    Je pense que, de toute façon, ton code que j'ai essayé n'est pas rédigé correctement.
    En reprenant exactement tes chiffres, j'ai donné la valeur 8 à ta fonction, regardes le résultat, il est faussé

    mais ce que j'en dis.....

    a +

    sinon, pour vérifier qu'il s'agit d'un chiffre, tu peux, entre autres, utiliser ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If Application.WorksheetFunction.IsNumber(Cells(i, 1).Value) = True Then

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    Je n'ai pas le droit à worksheet...mais le IsNumber me parait pas mal .

    Je dois trouver le plus grand élément dans ce tableau :

    A
    A
    8,16
    13,60
    7,31
    A
    10,24

    Pour ça il faut que je saute les A , que j'enregistre le 8,16 comme 1ere valeur et que j'utilise mon algo tout en sautant les A

  8. #8
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je ne sais pas remplacer le worksheetfunction mais pour moi ton code est là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function plusGrand(ByVal n) As Single
    Dim i As Integer
        For i = 13 To 19 ' ici je commence à ligne 13
    'reste ci-dessous à voir
        If Application.WorksheetFunction.IsNumber(Cells(i, 1).Value) = True Then
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
            End If
        Next i
     
    End Function

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Points : 350
    Points
    350
    Par défaut
    Salut,

    à essayer avec plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Function plusGrand(Plage) As Double
        Dim C As Range
        For Each C In Plage
          If IsNumeric(C) And C.Value > plusGrand Then plusGrand = C.Value
        Next
    End Function
    Remarque : le type SINGLE ne donne pas la même réponse !

  10. #10
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir Ordonc, re shaku

    Je ne comprends pas pourquoi plage mais isnumeric est la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function plusGrand(ByVal n) As Single
    Dim i As Integer
        For i = 13 To 19
        If IsNumeric(Cells(i, 1).Value) = True Then
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
            End If
        Next i
     
    End Function

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    case ton code je ne l'ai pas testé , mais il me semble manquer quelque chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(i, 1).Value > plusGrand Then
    plusGrand tu ne l'as initialisé nulle part ....

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Points : 350
    Points
    350
    Par défaut
    Re,

    j'ai choisi =plusGrand(A13 :A20) pour avoir aussi une sélection directe avec la souris comme tant d'autres fonctions mais, bien sûr, on peut faire autrement !

  13. #13
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Tu as raison, je crois devoir changer quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function plusGrand(ByVal n) As Single
    Dim i As Integer
        For i = 14 To 19
        If IsNumeric(Cells(i, 1).Value) = True Then
           If Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > Cells(i-1, 1).Value Then' voir ici
                    plusGrand = Cells(i, 1).Value
                End If
            End If
            End If
        Next i
     
    End Function
    J'espere que ceci devrait aller

    Excuses, mais je viens de tester, ça va pas,

    Je regarde mieux

    Par contre, ce code marche
    Inutile de donner une valeur à plusgrand au départ si tu commence le test à la ligne 13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function plusGrand(ByVal n) As Single
    Dim i As Integer
        For i = 13 To 19
        If IsNumeric(Cells(i, 1).Value) = True And Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                    plusGrand = Cells(i, 1).Value
                End If
            End If
     
        Next i
     
    End Function

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    il m'est malheureusement impossible d'utiliser ton code car dans ma feuille excel toutes les autres cases sont remplies d'informations , je dois vraiment écrire la fonction uniquement pour la plage où il y a les valeurs .

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Points : 350
    Points
    350
    Par défaut
    Re,

    j'aurais plutôt écrit cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function plusGrand(ByVal n) As Double
      Dim i As Integer
      For i = 13 To 19
        If IsNumeric(Cells(i, 1) And Cells(i, 1) > plusGrand Then plusGrand = Cells(i, 1)
      Next
    End Function
    avec, comme appel, =plusGrand(Moi), Moi n'étant pas un des caractères interdis !

    Avez-vous comparé Double et Single ?

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    vos codes ne peuvent pas convenir mais je viens d'avoir une idée , utiliser 2 boucles , l'une pour stocker une valeur et l'autre pour comparer . Je vais bosser sur cette idée .

  17. #17
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    regardes ce fichier test et essayes le

  18. #18
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    désolé case je n'accepte pas les fichiers joints ne le prends pas mal . J'ai écrit un code qui peut marcher je crois mais j'ai juste un soucis avec la boucle , regardez :

    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
    Function plusGrand(ByVal n As Integer) As Single
    Dim i As Integer
        For i = 14 To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
            plusGrand = Cells(i, 1).Value
            End If
            Exit For
        Next i
        For i = i To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > plusGrand Then
                plusGrand = Cells(i, 1).Value
                End If
            End If
        Next i
    End Function
    Vous voyez , dans la 1ere boucle , je stocke la 1ere valeur numérique pour la comparer ensuite dans la seconde boucle . Juste le probleme : cette fonction me renvoie uniquement la 1ere valeur numérique du tableau , comme ci elle bouclait pas...
    Ma seconde boucle doit reprendre où la 1ere se termine en fait .

  19. #19
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    mon dernier code marchait mais pour le tien, j'ai corrigé comme ça :
    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
    Function pg(ByVal n As Integer) As Single
    Dim i As Integer, x As Integer
        For i = 13 To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
            pg = Cells(i, 1).Value
            x = i
            Exit For
            End If
        Next i
        For i = x + 1 To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > pg Then
                pg = Cells(i, 1).Value
                End If
            End If
        Next i
    End Function
    il faudra prévoir une autre condition :
    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
    Function pg(ByVal n As Integer) As Single
    Dim i As Integer, x As Integer
        For i = 14 To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
            pg = Cells(i, 1).Value
            x = i
            Exit For
            End If
        Next i
    if x<19 then
        For i = x + 1 To 19
            If IsNumeric(Cells(i, 1).Value) And Cells(i, 1).Value < n Then
                If Cells(i, 1).Value > pg Then
                pg = Cells(i, 1).Value
                End If
            End If
        Next i
    end if
    End Function

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 66
    Points
    66
    Par défaut
    génial ça marche , ah on a bien bossé ensemble je trouve ça fait plaisir . Ta technique pour ma double boucle est très bien et j'ai appris le isnumeric que je ne connaissais pas merci .
    Il manque juste une petite chose à apporter à ma fonction : si jamais les 2 plus grandes valeurs sont égales , il n'y a pas de plus grande valeur et dans ce cas la fonction me renvoie "erreur" , c'est faisable de mettre cette option ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [TPW] Rechercher la plus grande valeur dans un tableau récursivement
    Par abdou monta dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 10/05/2013, 15h36
  2. Réponses: 4
    Dernier message: 08/10/2010, 15h27
  3. Réponses: 13
    Dernier message: 07/01/2007, 19h43
  4. [HTML/CSS]désigner un élément dans un tableau de l'extérieur
    Par FrankOVD dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/06/2005, 21h55
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

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