Bonjour,
J'ai recréé mes fonction en vba:
- DECBIN : Conversion decimal en binaire
- BINDEC : Conversion binaire en decimal
- REEL : conversion reel en binaire
et ma macro de conversion :
- testConversion
et ma macro de test : test3
Le but est de convertir un nombre à virgule flottant (REEL) en binaire 32 bit ( feuille Export_REAL EX / CELLULE B3), puis en décimal dans deux cellules de 16 bits ( Feuille EXPORT unIT ex : CELLULE B3 et C3). d'après la norme IEEE 754. les feuilles dans les 3 formats sont issus d'un seul tableau d'automate exporté en décimal,en hexadécimal et en réal ( nombre à virgule flottante)
donc Export_REAL!B3 = Export_UINT!B3 + Export_UINT!C3 = Export_UINT_BCD!B3 + Export_UINT!C3
Je n'arrive pas partir de mes valeurs de la feuille Export_REAL et trouvé les valeur des autres feuilles, de la feuille UINT pour commencer Je rencontre un problème de conversion avec les nombres décimaux supérieur à 7 chiffres avant la virgule.
je me vérifie avec ce site http://www.binaryconvert.com/convert_float.html
voir la Feuil1 avec la comparaison des résultats du site et mes fonctions marco VBA, en rouge les différences.
Auriez vous une idée d'ou pourrait venir le problème, précision d'excel? arrondi? , formule ?
Je sèche MERCI !
En pièce jointe le fichier sans macro
Option Explicit
Public Const F_DM = "Table_Echange"
Public Const F_UINT = "Export_UINT"
Public Const F_UINTBCD = "Export_UINT_BCD"
Public Const F_REAL = "Export_REAL"
Public Const F_MAJ = "SUIVI_MODIF"
Public Const F_LEG = "LEGENDE"
Public Const Ndepart = 2
Public Const Categorie1 = "Télé-Réglage"
Public Const T_UINT = "UINT"
Public Const T_UINT_BCD = "UINT_BCD"
Public Const T_REAL = "REAL"
Public Const ColDM = "G"
Public Const ColReg = "P"
'==== Conversion decimal en binaire
Function DECBIN(Val As Variant) '
Dim Bin As String
Dim A As String
Do Until Int(Val) = 0
If Val Mod 2 = 0 Then ' est pair
A = 0
Bin = A & Bin
Val = Val / 2
Else ' est impair
A = 1
Bin = A & Bin
Val = (Val - 1) / 2
End If
Loop
DECBIN = Bin
End Function
'==== Conversion binaire en decimal
Function BINDEC(ValBin As String)
Dim n, i, p As Integer
Dim Dec, A As Variant
n = Len(ValBin)
For i = 1 To n
p = i - 1 ' p sert d'exposant et de décalage , la position des caractères va de 1 à n alors l'exposant va de 0 à n-1
A = Mid(ValBin, n - p, 1)
If A = 0 Then ' on fait rien
Else
Dec = Dec + (2 ^ p)
End If
Next i
BINDEC = Dec
End Function
'======== conversion reel en binaire
Function REEL(Valeur As Variant) '
Dim c, m, E As Double
Dim cpt As Integer
Dim BinM, BinE As String
Dim A, Signe As String
'==test du signe
If Valeur < 0 Then
Signe = 1
Else
Signe = 0
End If
Valeur = Abs(Valeur)
Do Until Int(Valeur) = 1 Or c = 23
Valeur = Valeur / 2
c = c + 1 ' compteur pour le petit e
If Int(Valeur) = 1 Then
m = Valeur - 1 ' récupération de la mantisse
ElseIf c = 23 Then
m = Valeur - Int(Valeur)
Else
End If
Loop
E = c + 127
'MsgBox "Exposant = " & E & " / Mantice = " & m
' ==conversion de la mantisse en binaire
Do Until cpt = 23
m = m * 2
If Int(m) = 1 Then
BinM = BinM & Int(m)
m = m - Int(m)
Else
BinM = BinM & Int(m)
End If
cpt = cpt + 1
Loop
REEL = Signe & DECBIN(E) & BinM
MsgBox REEL
'Reel = CStr(Reel)
Range("A1").Value = REEL
End Function
Sub test3()
Dim WsDM As Worksheet
Dim WsUnit As Worksheet
Dim WsUBCD As Worksheet
Dim WsREAL As Worksheet
Dim ValConv As Double
Dim Bin32 As String
Dim A As Double
Set WsREAL = ThisWorkbook.Worksheets(F_REAL)
Set WsUnit = ThisWorkbook.Worksheets(F_UINT)
A = WsREAL.Range("B3").Value
'MsgBox a
REEL (-97883571)
End Sub
J'ai recréé mes fonction en vba:
- DECBIN : Conversion decimal en binaire
- BINDEC : Conversion binaire en decimal
- REEL : conversion reel en binaire
et ma macro de conversion :
- testConversion
et ma macro de test : test3
Le but est de convertir un nombre à virgule flottant (REEL) en binaire 32 bit ( feuille Export_REAL EX / CELLULE B3), puis en décimal dans deux cellules de 16 bits ( Feuille EXPORT unIT ex : CELLULE B3 et C3). d'après la norme IEEE 754. les feuilles dans les 3 formats sont issus d'un seul tableau d'automate exporté en décimal,en hexadécimal et en réal ( nombre à virgule flottante)
donc Export_REAL!B3 = Export_UINT!B3 + Export_UINT!C3 = Export_UINT_BCD!B3 + Export_UINT!C3
Je n'arrive pas partir de mes valeurs de la feuille Export_REAL et trouvé les valeur des autres feuilles, de la feuille UINT pour commencer Je rencontre un problème de conversion avec les nombres décimaux supérieur à 7 chiffres avant la virgule.
je me vérifie avec ce site http://www.binaryconvert.com/convert_float.html
voir la Feuil1 avec la comparaison des résultats du site et mes fonctions marco VBA, en rouge les différences.
Auriez vous une idée d'ou pourrait venir le problème, précision d'excel? arrondi? , formule ?
Je sèche MERCI !
En pièce jointe le fichier sans macro
Option Explicit
Public Const F_DM = "Table_Echange"
Public Const F_UINT = "Export_UINT"
Public Const F_UINTBCD = "Export_UINT_BCD"
Public Const F_REAL = "Export_REAL"
Public Const F_MAJ = "SUIVI_MODIF"
Public Const F_LEG = "LEGENDE"
Public Const Ndepart = 2
Public Const Categorie1 = "Télé-Réglage"
Public Const T_UINT = "UINT"
Public Const T_UINT_BCD = "UINT_BCD"
Public Const T_REAL = "REAL"
Public Const ColDM = "G"
Public Const ColReg = "P"
'==== Conversion decimal en binaire
Function DECBIN(Val As Variant) '
Dim Bin As String
Dim A As String
Do Until Int(Val) = 0
If Val Mod 2 = 0 Then ' est pair
A = 0
Bin = A & Bin
Val = Val / 2
Else ' est impair
A = 1
Bin = A & Bin
Val = (Val - 1) / 2
End If
Loop
DECBIN = Bin
End Function
'==== Conversion binaire en decimal
Function BINDEC(ValBin As String)
Dim n, i, p As Integer
Dim Dec, A As Variant
n = Len(ValBin)
For i = 1 To n
p = i - 1 ' p sert d'exposant et de décalage , la position des caractères va de 1 à n alors l'exposant va de 0 à n-1
A = Mid(ValBin, n - p, 1)
If A = 0 Then ' on fait rien
Else
Dec = Dec + (2 ^ p)
End If
Next i
BINDEC = Dec
End Function
'======== conversion reel en binaire
Function REEL(Valeur As Variant) '
Dim c, m, E As Double
Dim cpt As Integer
Dim BinM, BinE As String
Dim A, Signe As String
'==test du signe
If Valeur < 0 Then
Signe = 1
Else
Signe = 0
End If
Valeur = Abs(Valeur)
Do Until Int(Valeur) = 1 Or c = 23
Valeur = Valeur / 2
c = c + 1 ' compteur pour le petit e
If Int(Valeur) = 1 Then
m = Valeur - 1 ' récupération de la mantisse
ElseIf c = 23 Then
m = Valeur - Int(Valeur)
Else
End If
Loop
E = c + 127
'MsgBox "Exposant = " & E & " / Mantice = " & m
' ==conversion de la mantisse en binaire
Do Until cpt = 23
m = m * 2
If Int(m) = 1 Then
BinM = BinM & Int(m)
m = m - Int(m)
Else
BinM = BinM & Int(m)
End If
cpt = cpt + 1
Loop
REEL = Signe & DECBIN(E) & BinM
MsgBox REEL
'Reel = CStr(Reel)
Range("A1").Value = REEL
End Function
Sub test3()
Dim WsDM As Worksheet
Dim WsUnit As Worksheet
Dim WsUBCD As Worksheet
Dim WsREAL As Worksheet
Dim ValConv As Double
Dim Bin32 As String
Dim A As Double
Set WsREAL = ThisWorkbook.Worksheets(F_REAL)
Set WsUnit = ThisWorkbook.Worksheets(F_UINT)
A = WsREAL.Range("B3").Value
'MsgBox a
REEL (-97883571)
End Sub