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 :

fonction booléenne qui renvoie la valeur vraie si les horaires de la colonne sont en ordre croissant


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut fonction booléenne qui renvoie la valeur vraie si les horaires de la colonne sont en ordre croissant
    Bonjour comme le titre l indique j ai tenté d'écrire une fonction booléenne qui renvoie la valeur vraie si les horaires de la colonne sont en ordre croissant = false sinon .
    Le problème est que ça ne semble comparer que les deux premières lignes , si je met par exemple 18:00 suivi de 19:00 suivi de 20:00 ca me renvoie faux alors que c'est vrai . Je n'arrive pas a comprendre d'où viens le problème ...


    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub croissant () 
    dim i as integer
    dim a as boolean 
     
    do while (cells(i , 2).value <>"")
    if cells(i,2).value < cells(i+1,2).value then 
    cells(16,4).value =true 
    else 
    cell(16,4).value = false 
    end if 
    loop 
    i = i+1 
    end sub
    Merci d avance

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Beaucoup de points sur lesquels te pencher :
    1) format de tes cellules ?
    2) au départ, i, non initialisé, = 0 (quelle serait la cellule 0,2 ?)
    3) à quoi te sert a ? (tu ne t'en sers pas !
    4) ce que tu as écrit n'est pas une fonction, mais une procédure
    5) si tu ne quittes pas la procédure au premier "Faux" trouvé, elle continue et tout est faussé.
    6) ton incrémentation de i se fait ... hors boucle !!! (I ne change donc pas dans ta boucle et tu compares toujours la ligne 0 (!) avec la ligne 1))

    Je suis surpris que ta boucle s'arrête (je vois personnellement mal comment elle commence et, si elle commence, comment elle ne va pas à l'infini ...) ....

    EDIT : je veux croire que le code que tu montres n'est pas celui que tu utilises (il ne résulte en tout état de cause pas d'un copier/coller de ton code... certaines minuscules ici et là le laissent deviner ...)

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    une proposition qui tient compte des remarques d'ucfoutu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function Sitrie(rng As Range) As Boolean
    Dim i As Long
    Sitrie = True
    i = 1
    Do
        If rng.Cells(i + 1, 1).Value >= rng.Cells(i, 1).Value Then
            i = i + 1
        Else
            Sitrie = False
            Exit Do
        End If
    Loop Until i = rng.Rows.Count
    End Function

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Effectivement je venais de taper le code a la main

    Voici le copier coller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub croissant()
    Dim i As Integer
    i = 2
    Do While Cells(i, 2) <> ""
    If (Cells(i, 2).Value < Cells(i + 1, 2).Value) Then
    a = True
    Cells(16, 4).Value = a
    Else
    a = False
    Cells(16, 4).Value = a
    End If
    Loop
    i = i + 1
    End Sub
    Bizzarement maintenant j arrive même plus a executer mon code il bloque cela veut dire qu il doit aller jusqu a l infini . Je veux simplement qu il s arrete des qu il rencontre une ligne vide d ou mon <>""

    Sinon d apres tes conseils je devrais plutot ecrire un truc dans ce genre


    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
    Sub croissant()
    Dim i As Integer
    i = 2
    Do While Cells(i, 2) <> ""
    If (Cells(i, 2).Value < Cells(i + 1, 2).Value) Then
    a = True
    Cells(16, 4).Value = a
    i = i + 1
    Else
    a = False
    Cells(16, 4).Value = a
    exit sub
    End If
    Loop
    End Sub
    merci


    EDIT : je n'avais pas lu ta réponse mercatog je te remercie et ton code marche , mais j aimerai bien savoir d'oùu viens le problème de mon code de débutant

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    et pour corriger ta 2ème proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub croissant()
    Dim i As Integer
    Cells(16, 4).Value = True
    i = 3
    Do While Cells(i, 2) <> ""
        If Cells(i - 1, 2).Value <= Cells(i, 2).Value Then
            i = i + 1
        Else
            Cells(16, 4).Value = False
            Exit Do
        End If
    Loop
    End Sub
    Edit, Ton 2ème code fonctionnerait (même si tu ajoutes certaines lignes inutiles)!
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, 2).Value < Cells(i + 1, 2).Value
    La dernière boucle va comparer la cellule vide au delà de la plage des données avec la dernière cellule!!!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    OK merci j avais réecrit le code de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub croissant()
    Dim i As Integer
    Cells(16, 4).Value = True
    i = 2
    Do While Cells(i, 2).Value <> ""
    If Cells(i, 2).Value <= Cells(i + 1, 2).Value Then
    i = i + 1
    Else
    Cells(16, 4).Value = False
    Exit Do
    End If
    Loop
    End Sub
    ca me renvoyait tout le temps faux mais avec ton dernier edit j ai compris pourquoi , merci infiniment

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Ce qui devrait pouvoir s'exprimer ainsi, donc (écrit à main levée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub croissant()
      Dim i As Integer
      i = 2
      Do While Cells(i, 2).Value <> ""
        Cells(16, 4).Value = Cells(i, 2).Value <= Cells(i + 1, 2).Value 
        If  Cells(16, 4).Value = false then exit do
        i = i + 1
      Loop
    End Sub

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Oui, sauf qu'il fallait s'arrêter une case avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While Cells(i+1, 2).Value <> ""

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Oui...

    et également sauf qu'il serait plus intelligent de garder la variable a booléenne (celle du départ) et ne modifier la cellule 16, 4 qu'une seule fois in fine et encore plus intelligent de ne pas utiliser de variable booléenne, mais une vraie fonction (ce dont je suis à peu près certain de ce que c'est ce qui était demandé comme ... exercice...)
    Mais on va laisser faire aucunexperience (surtout si, comme je le pense, il s'agit là d'un exercice )

    EDIT :
    Pour mémoire : le litre même donné à cette discussion :
    fonction booléenne qui renvoie la valeur vraie si les horaires de la colonne sont en ordre croissant
    en dit long ...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Oui il fallait effectivement faire une fonction , et mercatog en a ecrit une toute belle toute propre avant de corriger ma procédure . Pour ma part je voulais simplement comprendre pourquoi ma procédure ne marchait pas et ça m a permis de comprendre et de découvrir plein de truc dont le exit do ...

    edit : et j en ai pas fini avec cette exercice donc jviendrai vous embêter plus tard lorsque j aurai testé plein de truc qui marche pas

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonne initiative et bonne intention ... et je n"'ai encore vu, dans cette discussion, aucune fonction ... )
    Tu découvriras à cette occasion (j'espère) pourquoi le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While Cells(i+1, 2).Value <> ""
    préconisé par Mercatog (pris tel quel) n'est pas suffisant, exprimé ainsi !
    Reviens avec une vraie fonction (et pas une procédure) et dis-nous où tu "coinces". Tu auras alors (promis, juré) une aide proportionnelle à tes efforts dans ce sens.
    Amitiés

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    mercatog a posté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function Sitrie(rng As Range) As Boolean
    Dim i As Long
    Sitrie = True
    i = 1
    Do
        If rng.Cells(i + 1, 1).Value >= rng.Cells(i, 1).Value Then
            i = i + 1
        Else
            Sitrie = False
            Exit Do
        End If
    Loop Until i = rng.Rows.Count
    End Function
    Si ce n est pas une fonction alors j ai vraiment rien compris a mes début de vba ...
    Je m en vais redoublé mes efforts sur les autres questions ... @ toute

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    1) Tu as raison : il s'agit bien là d'une fonction (ce message m'avait échappé)

    2) teste pour moi ce que ferait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Sitrie(rng As Range) As Boolean
       Sitrie = True
       For i = rng.Row To rng.Row + rng.Rows.Count - 2
        If Cells(i, rng.Column).Value > Cells(i + 1, rng.Column).Value Then Sitrie = False: Exit For
      Next
    End Function

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Ta fonction marche nickel ucfoutu , mais j ai pas trop saisie l histoire du rng.Rows.Count - 2 . Pourquoi -2

    J avais testé un truc de ce genre pour tester voir comment ca fonctionnait avec une boucle if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function sitrie(ByVal col As Range) As Boolean
    Dim i As Long
    sitrie = True
    i = 1
    For i = 1 To col.Rows.Count
    If Cells(i, 2).Value >= Cells(i + 1, 2).Value Then
    sitrie = False
    Exit For
    End If
    Next i
    End Function
    mais comme d hab ca marche pas et me renvoie faux tout le temps. Lol

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Pourquoi - 2 ?
    Tout simplement pour ne pas dépasser l'avant denière ligne ( la dernière étant le count -1) puisqu'on fait le test par rapport à la ligne suivante ( la count -1, donc, quand on est à la count -2 )

  16. #16
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function sitrie(col As Range) As Boolean
    Dim i As Long
    sitrie = True
    For i = 1 To col.Rows.Count-1
      If col.Cells(i, 1).Value >= col.Cells(i + 1, 1).Value Then
        sitrie = False
        Exit For
      End If
    Next i
    End Function
    edit, pas de byval

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    oki merci beaucoup , jvai finir par devenir un pro grâce a vous deux j ai encore compris plein de truc

  18. #18
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    c'est surtout grâce aux remarques pertinentes d'ucfoutu

  19. #19
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Les tiennes n'étaient pas moins importantes, mercatog.
    Tes remarques (que j'ai lues et appréciées) et les miennes ont été plus que complémentaires : elles lui ont montré des aspects différents du traitement, et c'est cela qui compte (cette découverte)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une fonction qui renvoie plusieurs valeurs ?
    Par chuckichucki dans le forum Langage
    Réponses: 9
    Dernier message: 14/01/2011, 13h49
  2. Fonction qui renvoie deux valeurs
    Par Sarune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/11/2008, 16h33
  3. Fonction qui renvoie deux valeurs
    Par Fractal LLG dans le forum Caml
    Réponses: 4
    Dernier message: 22/03/2008, 17h45
  4. Réponses: 5
    Dernier message: 23/05/2007, 19h43
  5. [Système] Fonction qui renvoie plusieurs valeurs
    Par sebhm dans le forum Langage
    Réponses: 6
    Dernier message: 26/01/2007, 08h43

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