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 :

Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)


Sujet :

Macros et VBA Excel

  1. #21
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Ok , merci beaucoup , je vais tester ,en tout cas merci pour le code et les explications, c'est vraiment sympa



    Bonjour , j'ai testé et sa fonctionne parfaitement.Cependant j'ai une petite question technique. Mon résultat s'affiche donc dans une cellule ("C2")

    Exemple : 3.658 --> dans C2 j'ai : 40 6A 1C AB .

    En faites je voudrais diviser le nombre hexa en 2

    Dans "C2" j'aurais : 40 6A et dans "C3" : 1C AB

    Je dois faire cela , car le logiciel ou j'envoi le nombre hexa veut le chiffre en 2 paquets .Voila merci

  2. #22
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Ca, c'est de la manipulation de chaines de caractères en Excel...

    Deux solutions:
    - solution "gain de temps de calcul" car un seul appel à la fonction. Récupérer la chaîne Hexa dans une cellule puis extraire les parties qui t'intéressent avec
    =GAUCHE(Chaîne; NbreCaractères) et =DROITE(Chaîne; NbreCaractères).

    - Récupérer directement ce qui t'intéresse avec
    =GAUCHE(DecimalVersFloatHexa(Nombre);NbreCaractères) et
    =DROITE(DecimalVersFloatHexa(Nombre);NbreCaractères)

    Dans tous les cas, pour une utilisation dans Excel, il est préférable d'ajouter la ligne
    dans la fonction DecimalVersFloatHexa en VBA.

    Le code de cette fonction commencerait donc par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function DecimalVersFloatHexa(ByVal Nombre As Single) As String
        ' Selon la nomre IEEE 754
        Dim i As Integer
        Dim Exposant As Integer
        Dim TropGrand As Boolean
        Dim Chaine As String
        Dim Multiplicande As Single
     
        Application.Volatile
        ...
    car cela force le recalcul de la fonction lors du recalcul de la feuille ou du classeur.

    Ok?

  3. #23
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    J'ai mis dans une cellule : =GAUCHE(DecimalVersFloatHexa(Nombre),4)
    et il me dit : #NOM?

    Et je n'ai pas trés bien compris le fonctionnement de :


    C'est bon ca fonctionne avec ta 1ère solution :

    J'ai mis : =GAUCHE(C2,4) et =DROITE(C2,4)

    Merci beaucoup.

  4. #24
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Ma remarque n'est pas utile dans ce contexte. Oublie...

  5. #25
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Bonjour , j'ai donc réussi a séparer mon nombre hexa en 2 paquet de 4 .Ensuite j'ai converti ces 2 paquet de nombre hexa en décimal grâce à cette fonction .

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function HexaToDec(ValHex As String) As Long
      HexaToDec = Val("&H" & ValHex & "&")
    End Function

    Mon programme fonctionne trés bien sur ma feuille excel, par contre parfois visual Basic me dit : dépassement de capacité ,j'aimerais régler ce problème .
    Merci

  6. #26
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Vu la discussion, je ne comprends pas ce que tu souhaites réaliser en faisant cela...

    En tout état de cause, tu ne retrouveras pas la valeur initiale.

    De plus, les fonctions que je t'ai exposées utilisent des réels simple (single), au vu de la précision 32 bits que tu demandais...

    Il faudrait voir avec quelles valeurs d'entrée tu as le problème, et sur quelle ligne le programme s'arrête...

  7. #27
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Au départ je devais envoyer 2 paquets d'hexa , mais j'ai eu de nouvelles consignes ,je dois convertir les 2 paquets en nombre décimaux et les envoyer.

    exemple :

    6.65 me donne en hexa float : 40 D4 CC CC

    1er paquet : 40 D4 qui donne en décimal 16596
    2éme paquet : CC CC qui donne en décimal 52428

  8. #28
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    La fonction que tu utilises (HexaToDec) ne saurait pas renvoyer un dépassement de capacité...

    Il faut cependant t'assurer que la variable qui récupère la valeur calculée par la fonction est bien de type Long. Si elle est de type Integer, tu planteras pour les valeurs > 32767

    Ok?

    De toi à moi: Cela ressemble de plus en plus à un exercice de cours, surtout si tu as 19 ans... Ou alors, on s'amuse à changer les caractéristiques des appareils avec lesquels tu dois dialoguer... Pas bien de tricher!!

  9. #29
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Non sérieusement ce n'est pas un exercice de cours .Je suis seulement en stage .

    OUI c'est exactement ca , ca plante pour les valeurs > 32767 , je vais essayer de résoudre ca , Merci

    PS : Je suis pas un tricheur

  10. #30
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Il suffit de modifier le type de la variable qui récupère la valeur. Il faut la déclarer
    Pour le tricheur, j'avais oublié le smiley ...

    [EDIT] Cela étant, je ne comprends pas le but de la manoeuvre[/EDIT]

  11. #31
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    HEUUUU ,je n'ai pas tout compris la

    J'envoi directement la valeur dans une cellule


    exemple : Feuil1.Cells(88, 14) = HexaToDec(Feuil1.Cells(88, 13))

  12. #32
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Peux-tu mentionner sur quelle ligne tu as le problème et avec quelle valeur d'entrée?

  13. #33
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Check Then
     
    For n = 0 To 8
     
         m_svr8.Register(n) = Cells(87 + n, 14)
        Next n
     End if
    End Sub

    Il plante à n=1 donc en Cells(88,14)

    La valeur de cette cellule est 52428 donc >>>>> 32767


    Ce ne surligne aucune erreur dans mes fonctions sur surligne seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_svr8.Register(n) = Cells(87 + n, 14)
    en me disant dépassement de capacité

    Petite précision :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Public m_svr8 As Object
     
     Public Sub OpenModbusSlave() 'Logiciel ou j'envoi les données 
     
    Set m_svr8 = CreateObject("mbslave.Document")
    status = m_svr8.CreateSlave(2, 3, 200, 8)
    status = m_svr8.ShowWindow


    Merci

  14. #34
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Je ne connais pas
    Mais je suppose que l'on ne peut pas passer des entiers longs comme valeur de propriété Register(n) de l'objet m_SVR8

    C'est quoi cet objet? Une classe perso? Une classe instanciée sur une librairie qui gère ton matériel?

    [EDIT 1]

    Ce qui m'étonne, c'est que tu boucles de 0 à 8 (cela fait 9 boucles...) pour passer 2 paquets...

    Es-tu sûr de ce que tu dois passer comme valeurs à la propriété Register(n)?

    Ce qui m'interpelle, c'est que le float contient 8 signes, ce qui correpondrait +/- à ta boucle...

    Peut-être serait-il plus simple que tu expliques ce que tu dois faire. Cela aiderait à ne pas jouer aux devinettes...
    [/EDIT 1]

    [EDIT 2]
    Plus j'y réfléchis, plus je me dis que ce truc n'a aucun sens.
    C'est complètement absurde de saisir des valeurs en décimal dans Excel pour les transformer en Float que l'on retransforme par paquets de 4 signes en décimal...
    T'es sûr que ce n'est pas en BCD que tu dois transformer tes saisies?
    [/EDIT 2]

  15. #35
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Nan c'est comme cela que je dois faire , mais je pense qu'on s'éloigne du problème car ce que je donné auparavant , sont des lignes de codes toutes faites par modbus slave , le problème doit surement comme tu l'avais dis être dans une déclaration de variable à mettre en LONG , sinon je ne vois pas ou peut-être l'erreur car même quand visual basic me dit capacité dépassé , modbus s'ouvre et reçoit bien les bonnes valeurs .
    Cette erreur n'empêche pas mon programme de fonctionner mais s'en m'embete que pour des valeurs > 32767 il m'affiche un message d'erreur
    Merci pour l'aide que tu m'apporte depuis le début

  16. #36
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Si cela pose problème avec des valeurs > 32767, c'est que tu ne peux pas passer des valeurs plus grandes...

    Or, la transcription d'une valeur décimale en Float elle-même scindée en 2 paquets de 4 signes hexadécimaux pouvant forcément être > 32767 montre une faille, soit dans le raisonnement, soit dans l'application...

    Mais en Float Hexa, tu as 8 signes. Et tu boucles de 0 à 8 (ou 1 à 8... ou 0 à 7???) Dès lors, peut-être dois-tu passer à la propriété Register(n) chaque signe hexa un à un...

    Quoi qu'il en soit, tu ne t'en sortiras pas sans examen détaillé du processus, de l'objet m_svr8 et de ses propriétés comme Register

  17. #37
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    OK , Merci pour tout sans toi je ne serais même pas arrivé a la moitié de ça !!





    Ps : je vais réouvrir une discussion ,car mon Pb n'est plus du tout pareil que le titre de cette discussion

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Conversion Image 32 bit virgule flottante en 8 bit niveaux gris
    Par magid31 dans le forum Général Java
    Réponses: 37
    Dernier message: 05/06/2012, 13h33
  2. [XL-2003] Conversion nombre décimal en heure
    Par anonymous1.0 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/02/2011, 12h54
  3. Conversion nombre décimal <-> binaire (signé et flottant)
    Par lecteur1001 dans le forum Simulink
    Réponses: 12
    Dernier message: 06/01/2011, 16h49
  4. Réponses: 6
    Dernier message: 16/05/2004, 19h03

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