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 :

Parité pair; impair


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut Parité pair; impair
    Bonsoir à tous,
    Ma question va parraitre simple peut être mais j'essaie de donner à une variable booleen le résultat vrai faux sur la parité d'un nombre entier et je ne trouve pas de fonction qui donne ça. Il y a bien dans excel les fonctions impair/pair mais ça va pas, par contre quand je tape odd ou even en minuscule là c'est reconnu par l'éditeur en forçant une majuscule à la première lettre des mots mais ça plante à l'excution

    Avez vous un avis?

  2. #2
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Pour savoir si un nombre est pair ou impair tu peux utiliser le modulo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub TestModulo()
        MsgBox (7 Mod 2)
        MsgBox (8 Mod 2)
    End Sub
    Avec un if et modulo tu peux réussir ce que tu veux!

  3. #3
    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,

    Je préfèrerais éviter le modulo, en ce qui me concerne.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Command1_Click()
      MsgBox parite(12)
    End Sub
     
    Private Function parite(nb As Long) As Boolean
      parite = (nb And 1) = 0
    End Function

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Et bé merci à vous y a donc pas directement de fonction toute faite ça me rassure dans mes recherches !

    je comprends dans la seconde solution que l'on crée un nouvelle fonction?

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Je préfèrerais éviter le modulo, en ce qui me concerne.
    Cette phrase me titille...
    aussi, je me suis permis quelques tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test1()
        Dim i As Long
        Dim n As Long
        n = Timer
        For i = 0 To 100000
            Debug.Print (i Mod 2) = 0
        Next
        Debug.Print Timer - n
    End Sub
    Traitement en (environ) 90.5 secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Test2()
        Dim i As Long
        Dim n As Long
        n = Timer
        For i = 0 To 100000
            Debug.Print CBool(i And 1)
        Next
        Debug.Print Timer - n
    End Sub
    Traitement en (environ) 90.8 secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Function parite(nb As Long) As Boolean
      parite = (nb And 1) = 0
    End Function
    Sub Test3()
        Dim i As Long
        Dim n As Long
        n = Timer
        For i = 0 To 100000
            Debug.Print parite(i)
        Next
        Debug.Print Timer - n
    End Sub
    Traitement en (environ) 90.7 secondes

    Autant dire que les résultats sont les mêmes pour 100000 itérations.
    La première renvoie forcément un boolean puisqu'on utilise un opérateur de comparaison, avec le modulo
    La deuxième cast explicitement le résultat avec Cbool et utilise le masque de bits
    La troisième passe par une fonction avec un cast implicitement en raison du type renvoyé, quand le résultat de l'oparation est un Long.

    D'où ma question...
    Pourquoi préférer éviter le modulo ?

  6. #6
    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, Maxence Hubiche,

    Les tests que tu fais utilisent tous le debug.Print qui, à lui seul, prend énormément (près de 100 fois plus) plus de temps que le calcul lui-même (le temps de rafraichissement de l'écran) et vient donc complètement fausser la mesure. Ceci est d'autant plus gênant que la rapidité de l'exécution de l'affichage dépend de l'état de ta machine et varie d'un instant t0 à un instant t1 très rapproché.

    Il y a un autre aspect : appel d'une fonction (et reprise du "retour") d'un côté et utilisation directe dans la procédure, de l'autre ...

    Si l'on veut comparer la vitesse d'un calcul par rapport à celle de l'autre, il faut bien évidemment ne pas "encombrer" par autre chose que le calcul lui-même. Comme ce dernier risque par ailleurs d'être très rapide, il faut pousser à fond le nombre d'itérations.

    Procède ainsi :

    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
    Private Sub Command1_Click()
        Dim i As Long, n As Long, res As Boolean
        n = Timer
        For i = 0 To 10000000
            res = (i And 1) = 0
        Next
        MsgBox Timer - n
    End Sub
     
    Private Sub Command2_Click()
        Dim i As Long, n As Long, res As Boolean
        n = Timer
        For i = 0 To 10000000
           res = (i Mod 2) = 0
        Next
        MsgBox Timer - n
    End Sub
    et prends ces mesures plusieurs fois (car elles vont continuer à dépendre de l'état de ta machine à tel ou tel autre instant).
    Tu constateras que l'emploi du modulo est plus lent

    Mais ce n'est pas cette différence non réellement significative d'exécution qui me conduit à ne pas aimezr l'utilisation du modulo (une question de goût personnel, peut-être ?)

    Amitiés

  7. #7
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    D'accord pour la réponse "Goût personnel"

    Pour les autres arguments, je dirai :
    Les tests sont là pour tester... donc, plusieurs solutions, sinon pas de tests. Et j'ai mis dans le cas 3 la solution que tu proposais (avec fonction).
    Le debug.print est gourmand, oui, je le sais. Mais, comme je l'utilise dans les trois procédures, le delta est négligeable puisqu'équitable.
    Enfin, sur l'aspect état de la machine, pas de soucis, les résultats montrés sont une moyenne. Je ne suis pas complètement NewBy

    Bref, si tous le résultats se bousculent à quelques centièmes de secondes pour 100000 itérations, je ne vais pas en faire un fromage. L'opération seule prenant un temps non mesurable sur PC.

    J'accepte donc pleinement l'item : Goût personnel, que je respecte ne serait-ce que pour son aspect esthétique

    Merci

  8. #8
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    En tout cas merci, j'ignorai pour ma part que le debug prenais tant de temps !
    Alrors je vais de ce pas les retirer là ou ils n'étaient pas nécessaire.
    Merci.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    Merci pour vos réponses concernant "ma demande" j'ai deplus appris à chronometrer des opérations.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/04/2007, 18h09
  2. Réponses: 8
    Dernier message: 28/07/2006, 14h32
  3. [PL/SQL - PAIR/IMPAIR] Recherche fonction
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 06/02/2006, 14h47
  4. [CR8.5] Détail Paires/Impaires
    Par PAC76 dans le forum Formules
    Réponses: 6
    Dernier message: 28/05/2004, 11h08
  5. Calculer la parité paire d'un char
    Par James_ dans le forum C
    Réponses: 15
    Dernier message: 03/09/2003, 23h55

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