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 :

[VBA-E] différences entre VBA Mod et Excel Mod


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 49
    Points
    49
    Par défaut [VBA-E] différences entre VBA Mod et Excel Mod
    Bonsoir,
    Petit souci VBA Excel
    Un petit souci je n'arrive pas à convertir en VBA la fonction precedente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ENT(MOD(ENT((A1-2)/7)+0,6;52+5/28))+1
    Je trouve à chaque fois le mauvais résultat, je craque pourtant ca doit pas etre...
    Merci

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    As tu essayé d'utiliser la méthode Evaluate?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Application.Evaluate("INT(MOD(INT((A1-2)/7)+0.6,52+5/28))+1")

    michel

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    hello
    en fait, tu dois utiliser formulalocal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(2, 2).FormulaLocal = "=ENT(MOD(ENT((A1-2)/7)+0.6;52+5/28))+1"
    et fait atention au séparateur du 0.6 ou 0,6. sur ma bacane, j'ai du le changer, mais la ça marche
    voila voila

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Je crois avoir cerné le problème à deaqu1 .. il sagit de la fonction MOD d'excel qui ne donne pas le même résultat que l'opérateur Mod de VBA ...

    le code à SilkyRoad en utilisant la méthode Evaluate, utilise la fonction MOD d'excel..et permet de contourner le problème..


    vu dans l'aide en ligne VBA :
    L'opérateur modulo, ou reste, divise l'argument number1 par l'argument number2 (en arrondissant les nombres à virgules flottantes à des nombres entiers) et ne retourne que le reste dans l'argument result. Par exemple, dans l'expression ci-dessous, A (argument result) est égal à 5.
    donc en VBA avec l'opérateur modulo les arguments sont "arrondi" ... d'ou ..
    par exemple
    donne 11
    comme
    ce qui n'est pas le cas avec la fonction MOD d'excel qui renvoie 10.6 pour
    et 11 avec 635.....



    une solution alternative à celle à SilkyRoad .. et d'utiliser "l'équivalent" à la fonction MOD d'excel .. que l'on trouve dans l'aide en ligne :

    La fonction MOD peut aussi s'exprimer en utilisant la fonction ENT :
    MOD(n, d) = n - d*INT(n/d)


  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 49
    Points
    49
    Par défaut alternative
    J'ai réussi à m'en sortir de la façon suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sheets("Feuil1").Select
     
    For j = 1 To 7
     
        Valeur = ActiveSheet.Range("C" & j).Value
     
        n1 = Int((Valeur - 2) / 7) + 0.6
        n2 = 52 + 5 / 28
        n3 = Int(n1 - n2 * Int(n1 / n2)) + 1
        ActiveSheet.Range("f" & j).Value = n3
     
    Next
    C'est barbare, je sais...
    A la rigueur si quelqu'un aune astuce pour tout compresser, c'est pas de refus.

    PS: Merci Bbil pour tes petits cours...

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour

    Un petit souci je n'arrive pas à convertir en VBA la fonction precedente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    =ENT(MOD(ENT((A1-2)/7)+0,6;52+5/28))+1
    J'ai réussi à m'en sortir de la façon suivante...

    Sheets("Feuil1").Select

    For j = 1 To 7

    Valeur = ActiveSheet.Range("C" & j).Value

    n1 = Int((Valeur - 2) / 7) + 0.6
    n2 = 52 + 5 / 28
    n3 = Int(n1 - n2 * Int(n1 / n2)) + 1
    ActiveSheet.Range("f" & j).Value = n3

    Next

    C'est barbare, je sais...
    A la rigueur si quelqu'un aune astuce pour tout compresser, c'est pas de refus.
    -->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Int((Range("A1").Value - 2) / 7 + 0.6) Mod (52 + (5 / 28) + 1)
    En précisant que cela n'est pas une "astuce"
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re une petite fonction bien sympa
    Bonsoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
        MsgBox Excelfunction_MOD(127.357, 33.2)
        MsgBox Excelfunction_MOD(183.5, 34)
        MsgBox Excelfunction_MOD(2345.58, 87)
    End Sub
    '
    '
    Function Excelfunction_MOD(N, D)
        NBdec = Len(Replace(CStr(N), Int(N), ""))
        'NBdec = Len(CStr(N - Int(N)))   'etonnament avec  celle ci le resultat n'arrondi pas les decimale
        Excelfunction_MOD = Round(N - D * Int(N / D), NBdec)
    End Function
    Nom : demo2.gif
Affichages : 2906
Taille : 240,4 Ko

    edit:
    petite correction sur le nombre de decimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim NbDec
        NbDec = Len(Replace(CStr(N), Int(N) & ",", ""))
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour patricktoulon

    Toujours prendre pour base le plus grand nombre de décimales entre celui du nombre et celui de son diviseur.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    oui je l'ai remarqué en faisant les tests
    bref c'est propre comme fonction
    ce qui me pertube plus c'est les 2 nbdec qui me donne le meme nombre de decimal sauf que le resultat en nombre de decimales arrondi est différent c'est une enigme

    teste une fois l'un une fois l'autre tu verra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
        MsgBox Excelfunction_MOD(127.357, 33.2)
        MsgBox Excelfunction_MOD(183.5, 34)
        MsgBox Excelfunction_MOD(2345.58, 87)
    End Sub
    '
    '
    Function Excelfunction_MOD(N, D) As Double
        Dim NbDec
        NbDec = Len(Replace(CStr(N), Int(N) & ",", "")) donne le nombre de decimal
         'NbDec = Len(CStr(N - Int(N))) - 1 ' donne pareil  mais etonnament avec  celle ci le resultat n'arrondi pas les decimale
        Excelfunction_MOD = Round(N - D * Int(N / D), NbDec)
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    ce qui me pertube plus c'est les 2 nbdec qui me donne le meme nombre de decimal sauf que le resultat en nombre de decimales arrondi est différent c'est une enigme
    Résultat de difficultés de Excel en matière d'arithmétique flottante.

    C'est la raison pour laquelle je préfère personnellement calculer dur la base d'une puissance de 10, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Excelfunction_MOD = ((N * (10 ^ NbDec)) Mod (D * (10 ^ NbDec))) / 10 ^ NbDec
    où nbdec est le nombre le plus élevé de décimales entre le nombre et son diviseur.
    Inconvénient -->> limites des nombres trop élevés ou/et d'un nbdec trop élevé (mais je vois mal à quelles occasions on aurait alors besoin de calculer utilement de tels restes).
    Bonne nuit
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/04/2011, 20h21
  2. [XL-2003] Différence entre les fonctions Round() Excel et VBA ?
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2010, 15h22
  3. Différences entre vba excel 2000 et 2003
    Par naty76 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/02/2009, 09h17
  4. Différence entre VBA 6.0 et .NET
    Par thyresias dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/10/2006, 10h14
  5. [VBA-E] Différence entre 2 dates
    Par ptitsoleil87 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/12/2005, 13h23

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