VBA - Conversion décimal en Binaire
Fermé
Julien87
-
Modifié le 22 févr. 2022 à 21:21
NHenry Messages postés 15190 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 février 2025 - 24 févr. 2022 à 19:19
NHenry Messages postés 15190 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 février 2025 - 24 févr. 2022 à 19:19
A voir également:
- VBA - Conversion décimal en Binaire
- Binaire - Guide
- Monnaie conversion - Télécharger - Banque & Budget
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Convertir heure en décimal excel ✓ - Forum Excel
- Find vba - Astuces et Solutions
5 réponses
NHenry
Messages postés
15190
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 février 2025
353
22 févr. 2022 à 21:25
22 févr. 2022 à 21:25
S = S / 2 - 0.1
S étant un long et 0.1 un flottant, si on part à S=10
S/2=5
5-0.1=4.9
Et remettre dans S fait une troncature donc S=4
5<>4 dont ça te met 1
Essayes plutôt un truc du genre :
Et pour la boucle, même si While/Wend ça fonctionne encore, on lui préfère Do While/Loop.
S étant un long et 0.1 un flottant, si on part à S=10
S/2=5
5-0.1=4.9
Et remettre dans S fait une troncature donc S=4
5<>4 dont ça te met 1
Essayes plutôt un truc du genre :
S=F/2 If S*2=F Then REM 0 Else Rem 1 End If F=S
Et pour la boucle, même si While/Wend ça fonctionne encore, on lui préfère Do While/Loop.
NHenry
Messages postés
15190
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 février 2025
353
23 févr. 2022 à 23:16
23 févr. 2022 à 23:16
J'obtiens "110010001" pour 401 sur les macros de LibreOffice avec ce code :
J'ai renommé les variables pour les rendre un peu plus clair.
J'ai forcé le ByVal
J'ai forcé le type de lBase
J'ai ajouté le "int" sur la division car l'interpréteur Basic de LO faisait l'arrondi au lieu de la troncature
J'ai aussi indenté le code pour le rendre plus lisible
Sub Main dim lStr as string lStr=convertisseur10a2(401) lStr=lStr End Sub Function convertisseur10a2(ByVal pValeur As Long) As String Dim lInt As Long Dim lBase as String, lNewBase As String lBase = "" While pValeur > 1 lInt = int(pValeur / 2) If pValeur = lInt * 2 Then lNewBase = "0" Else lNewBase = "1" End If lBase = lNewBase & lBase pValeur = lInt Wend convertisseur10a2 = "1" & lBase End Function
J'ai renommé les variables pour les rendre un peu plus clair.
J'ai forcé le ByVal
J'ai forcé le type de lBase
J'ai ajouté le "int" sur la division car l'interpréteur Basic de LO faisait l'arrondi au lieu de la troncature
J'ai aussi indenté le code pour le rendre plus lisible
J'ai essayé de faire comme vous m'avez montré mais la fonction affiche uniquement un 1.
J'ai donc sinon pensé à l'écrire de la façon ci dessous, sans le 0,1 mais cela me donne des nombres incohérents : pour 518 cela me donne 1000001000 au lieu de 1000000110
Function convertisseur10a2(valeur As Long) As String
Dim S As Long
Dim base, newbase As String
base = ""
Do While valeur > 1
S = (valeur - 1) / 2
valeur = valeur / 2
If valeur = S Then
newbase = "1"
valeur = S
Else
newbase = "0"
End If
base = newbase & base
Loop
convertisseur10a2 = "1" & base
End Function
J'ai donc sinon pensé à l'écrire de la façon ci dessous, sans le 0,1 mais cela me donne des nombres incohérents : pour 518 cela me donne 1000001000 au lieu de 1000000110
Function convertisseur10a2(valeur As Long) As String
Dim S As Long
Dim base, newbase As String
base = ""
Do While valeur > 1
S = (valeur - 1) / 2
valeur = valeur / 2
If valeur = S Then
newbase = "1"
valeur = S
Else
newbase = "0"
End If
base = newbase & base
Loop
convertisseur10a2 = "1" & base
End Function
NHenry
Messages postés
15190
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 février 2025
353
23 févr. 2022 à 19:50
23 févr. 2022 à 19:50
Déjà, Merci d'utiliser la coloration syntaxique (voir ton premier message que j'avais modifié)
Concernant mon exemple, je n'ai fais qu'une itération, il faut en faire une boucle pour que ça fonctionne.
Toujours mettre ByVal dans les paramètres, sinon ils sont passés par référence (mettre ByRef si c'est volontairement passé en référence).
Dim base, newbase As String
Base est de type Variant
Dim base as String, newbase As String
base est de type String
Valeur=518
S=(518-1)/2=517/2=258.5=258 (troncature
valeur=518/2=259
Newbase="1"
Alors qu'avec mon bout de code :
F=518
S=F/2=518/2=259
If S*2=F Then '259*2=518
Newbase="0"
End If
F=S=259
Ton code devrait être au pire (en reprenant tes variables) :
S=Valeur/2
If S*2=Valeur Then
NewBase="0"
Else
NewBase="1"
End if
base = newbase & base
Valeur=S
Si tu ne comprends pas comment fonctionne ton code, utilise le debuggeur :
F9 pose/retire un point d'arrêt
F8 fait un pas à pas
Shift+F8 fais un pas à pas sans entrer dans le détail
F5 lance le programme jusqu'au prochain arrêt
Shift+F9 (de mémoire) permet d'espionner la valeur d'une variable.
Concernant mon exemple, je n'ai fais qu'une itération, il faut en faire une boucle pour que ça fonctionne.
Toujours mettre ByVal dans les paramètres, sinon ils sont passés par référence (mettre ByRef si c'est volontairement passé en référence).
Dim base, newbase As String
Base est de type Variant
Dim base as String, newbase As String
base est de type String
Valeur=518
S=(518-1)/2=517/2=258.5=258 (troncature
valeur=518/2=259
Newbase="1"
Alors qu'avec mon bout de code :
F=518
S=F/2=518/2=259
If S*2=F Then '259*2=518
Newbase="0"
End If
F=S=259
Ton code devrait être au pire (en reprenant tes variables) :
S=Valeur/2
If S*2=Valeur Then
NewBase="0"
Else
NewBase="1"
End if
base = newbase & base
Valeur=S
Si tu ne comprends pas comment fonctionne ton code, utilise le debuggeur :
F9 pose/retire un point d'arrêt
F8 fait un pas à pas
Shift+F8 fais un pas à pas sans entrer dans le détail
F5 lance le programme jusqu'au prochain arrêt
Shift+F9 (de mémoire) permet d'espionner la valeur d'une variable.
Merci d'avoir prit le temps de répondre à mon problème, j'ai donc modifié mon code avec votre exemple et même en mettant pas à pas, je ne comprend pas pourquoi il ne marche toujours pas. Il me donne des valeurs qui ne sont malheureusement pas exacts :
pour 401, par exemple, je trouve : 1010010001 au lieu de 110010001
Voici la modification :
pour 401, par exemple, je trouve : 1010010001 au lieu de 110010001
Voici la modification :
Function convertisseur10a2(valeur As Long) As String Dim S As Long Dim base, newbase As String base = "" While valeur > 1 S = valeur / 2 If valeur = S * 2 Then newbase = "0" Else newbase = "1" End If base = newbase & base valeur = S Wend convertisseur10a2 = "1" & base End Function
EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
D'accord super merci, le code marche bien.
J'aurais juste une dernière question.
Je ne comprend pas vraiment à quoi sert le ByVal ?
J'aurais juste une dernière question.
Je ne comprend pas vraiment à quoi sert le ByVal ?
NHenry
Messages postés
15190
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 février 2025
353
24 févr. 2022 à 19:19
24 févr. 2022 à 19:19
Le ByVal sert à passer le paramètre par valeur et non par référence (par défaut)
Cela évite de changer la valeur dans l'appelant.
Cela évite de changer la valeur dans l'appelant.