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 :

Problème d'arrondi suite à une fonction


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut Problème d'arrondi suite à une fonction
    Bonjour à toutes et tous;

    Je rencontre un problème que je n'arrive pas à résoudre.
    J'ai un fichier dans lequel j'enregistre des résultats de mesure d'un tensiomètre.
    Mon fichier est organisé de la manière suivante:

    • Col A : Date du jour.
    • Col B (SYS) : Résultat d'une mesure.
    • Col C (DIA) : Résultat d'une autre mesure
    • Col D (PUL) : Autre résultat.
    • Col E (Tension) : Résultat de mon calcul.


    J'ai le même groupe de colonnes (B,C,D,E) répétées deux fois de plus (3 au total).

    En fait en une mesure le tensiomètre affiche ces 3 résultats (SYS, DIA, PUL), sur un écran.
    Je dois reconstruire certains de ces résultats pour obtenir la tension sous une forme connue.
    Par exemple :

    • SYS = 137
    • DIA = 79


    Alors la tension calculée doit être égale à 13,7.
    Pour ce faire je voudrais créer une fonction, dont voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function Tension(sys, dia) As Double
     
    Dim TensSys As Integer
    Dim TensDia As Integer
    TensSys = sys / 10
    TensDia = dia / 10
    Tension = TensSys & "," & TensDia
     
    End Function
    Si je reprends les valeurs données plus haut, soit SYS=137 et DIA=79, au lieur d'avoir le résultat de 13,7 j'obtiens 13,8.
    C'est lors de la division de DIA par 10 qui donne un résultat 7,9 qui se trouve arrondi à 8.
    Mais alors pourquoi la division de SYS me donne bien 13, et non 14 ?

    Je n'arrive pas à résoudre ce problème.
    Je pense que je me suis perdu en essayant plein de modifications, et je n'arrive à rien. Mon neurone a explosé en plein vol.

    Quelqu'un aurait-il la gentillesse de m'aider, en m'expliquant comment me sortir de cette marmelade ?
    Je l'en remercie par avance.
    A toutes fins utiles je joins mon fichier.

    PS : Dans mon fichier le résultat dans E4 est calculé par la fonction "Tension".
    Tension FSE.xlsm

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    Hello,
    Heu non c'est Sys = 132 avec dia=79 qui donne 13,8
    Sys=137 avec dia=79 donne 14,8
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour Jurassic Pork;
    En effet je me suis emmêlé les pinceaux.
    Pour autant je n'arrive toujours pas à résoudre mon problème.
    Bonne soirée à toi.

  4. #4
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    Salut, si j'ai bien compris ce que tu veux, tu peux utiliser la formule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CONCATENER(TRONQUE(B4/10)&","&TRONQUE(C4/10))
    ou alors sous forme de fonction personnalisée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Tension(B As Range, C As Range) As String
        Tension = Int(B.Value / 10) & "," & Int(C.Value / 10)
    End Function

  5. #5
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour Franc;
    Merci pour ta réponse, je vais de ce pas la tester et te tiendrais au courant dans la journée.
    Bonne journée à toi.

  6. #6
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Franc;

    Concernant la solution de la formule dans chaque cellule, c'est parfait et fonctionne très bien.

    Mais j'aimerais bien évoluer et comprendre le système de fonction.

    J'ai donc tenté d'utiliser ta solution de Fonction; mais je rencontre un problème qui est le suivant :
    En fait sur la ligne B4 cela fonctionne parfaitement, mais si j'utilise la fonction sur la ligne suivante j'ai une erreur #NOM!.

    Je pense que cela vient du fait que tu adresses directement les cellules B4 et C4 dans la fonction.
    Alors comment faire pour que cela soit valide pour toutes les lignes pour les colonnes B et C.

    J'adapterai alors la solution pour que cela fonctionne pour les autres colonnes I et M qui doivent fonctionner de la même manière. En effet je dois faire 3 mesures par jour matin, midi et soir.
    Le décalage des colonnes est le même que pour B et C.

    Encore merci encore pour ton aide.
    Bonne journée à toi.

  7. #7
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    Je me rends compte que tu utilises les résultats pour calculer des moyennes, donc la formule que je t'ai proposée posera problème pour les calculs puisque le résultat est une chaîne de caractères, idem pour la fonction que j'ai donc modifiée.
    Je l'ai testée sur ta feuille de calcul et fonctionne parfaitement quelles que soient les cellules sélectionnées. Le fait que j'utilise B et C pour définir la formule n'implique pas que cela ne fonctionne que pour B et C, j'aurais aussi bien pu utiliser X et Y en les reprenant dans la fonction = Int(X.Value / 10) + Int(Y.Value / 10) / 10.
    Pour t'expliquer en gros le fonctionnement d'une fonction, tu mets entre parenthèses le nombre et type de paramètre à utiliser, et après la parenthèse le type de valeur retourné après avoir appliqué le traitement voulu aux paramètres utilisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Tension(B As Range, C As Range) As Double
        Tension = Int(B.Value / 10) + Int(C.Value / 10) / 10
    End Function

  8. #8
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Franc;

    Merci pour ton aide.

    Je vais regarder tout cela de plus près.
    Car je dois avoir de la M....E dans les yeux, en effet après avoir repris ta fonction j'ai toujours la même erreur qui s'affiche : #NOM?.
    Et cela quand je teste dans les colonnes I et M.

    Alors voilà comment je procède pour la mise à jour de la fonction :


    • Je recopie ton code dans un module de mon classeur (module Tension).
    • Je sauvegarde le code.
    • Puis je passe dans mon classeur.
    • Dans la cellule J4 et K4 je saisi mes valeurs.
    • Et dans la cellule M4 je récupère le code erreur "#NOM?"


    Je dois reprendre tout cela à tête reposée, car je suis sûr que le problème vient de l'interface entre le cerveau et le clavier.
    Merci encore de t’intéresser à mon soucis.
    Bonne journée.

    P.S : Peux-tu mettre en pièce jointe ton fichier qui est fonctionnel ?
    Peut-être pourrais-je comprendre alors mon erreur.

  9. #9
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    dans M4 tu as bien saisi la formule comme ceci: =Tension(J4;K4) ?

  10. #10
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour Franc;
    Oui j'ai saisi la fonction exactement comme cela.
    Et toujours la même erreur #NOM?

  11. #11
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    J'ai modifié la fonction, je me suis rendu compte que quand une des cellules est vide, la fonction renvoie 0 et fausse ensuite le calcul des moyennes.
    Je t'envoie aussi le classeur en pièce jointe et qui fonctionne parfaitement chez moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function Tension(B As Range, C As Range) As Variant
        Dim result As Double
        result = Int(B.Value / 10) + Int(C.Value / 10) / 10
        If result = 0 Then
            Tension = ""
        Else
            Tension = result
        End If
    End Function
    Fichiers attachés Fichiers attachés

  12. #12
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Bonjour,
    Une remarque (peut-être hors sujet) :
    Si la mise à jour des calculs ne doit se faire que lorsque la source change et pas à chaque fois qu'une cellule de
    la feuille est modifiée, je propose d'utiliser l'instruction Application.Volatile False en début de code.
    Ça permet de rendre le traitement plus rapide, mais c'est facultatif.
    Bonne programmation.

  13. #13
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour à toutes et tous;
    Pour Franc;
    Tout marche bien sauf dans le cas suivant : si la deuxième valeur de la mesure est supérieure à 100, alors le résultat est faux.
    Exemple : J'utilise les noms dans la fonction.
    B = 150
    C=102
    Alors le résultat tension est = 16 au lieu de 15,1.
    Je pense donc qu'il faille tenir compte de cela dans la fonction. Mais je ne vois pas comment gérer ce cas.

    Dans tous les cas je te remercie pour ton aide.

    Pour laurent_ott;
    J'avoue ne pas avoir le niveau pour appréhender de telles subtilités.
    Pour moi j'avoue que le temps de traitement n'est pas une chose importante.
    Je verrais donc à quoi correspond ta proposition, mais plus dans un but d'apprentissage.
    Dans tous les cas merci à toi.

    Je vous souhaite à tous les deux une bonne journée.

  14. #14
    Membre éprouvé
    Inscrit en
    Décembre 2002
    Messages
    800
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 800
    Points : 1 259
    Points
    1 259
    Par défaut
    Oula, quelle tension élevée

    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 Tension(B As Range, C As Range) As Variant
     
        If IsEmpty(B) Or IsEmpty(C) Then
            Tension = ""
        Else
     
        Dim firstValue As String
        Dim secondValue As String
     
        firstValue = Left(B.Value, Len(B.Value) - 1)
        secondValue = Left(C.Value, Len(C.Value) - 1)
     
        Tension = CDbl(firstValue & "," & secondValue)
     
        End If
     
    End Function

  15. #15
    Membre du Club Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Franc;
    Merci pour cette solution.
    Quand je vois la fonction, je me dis que j'aurais pu la trouver tout seul, au lieu de demander.
    Je vais mettre cela en place tout de suite.

    Hé oui ma femme fait des sautes de tension sans que l'on ne comprenne pourquoi, et je dois suivre cela et communiquer au médecin ses résultats.

    Un grand merci et une bonne journée à toi.

Discussions similaires

  1. [AC-2010] Problème de somme suite à une fonction Nz
    Par arsenic1 dans le forum Access
    Réponses: 3
    Dernier message: 22/11/2012, 13h30
  2. Réponses: 7
    Dernier message: 05/05/2006, 09h48
  3. Problème d'execution d'une fonction
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 17/03/2006, 11h37
  4. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  5. Réponses: 7
    Dernier message: 12/03/2006, 21h18

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