VBA - Conversion décimal en Binaire

Fermé
Julien87 - Modifié le 22 févr. 2022 à 21:21
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 24 févr. 2022 à 19:19
Bonjour,
Je souhaite convertir un nombre de base 10 à base 2 sur VBA Excel sans utiliser la fonction Mod et les puissances. J'ai ainsi réaliser cette fonction qui ne marche pas malheureusement. Lorsque je la lance elle affiche systématiquement une liste de 1. Comment pourrez t-elle fonctionner sans trop la changer ?

Function convertisseur10a2(valeur As Long) As String
Dim S, F As Long
Dim base, NewBase As String
base = ""
S = valeur
F = valeur
While F > 1
F = F / 2
S = S / 2 - 0.1
If F = S Then
NewBase = 0
Else
NewBase = 1
End If
base = NewBase & base
F = S
Wend
convertisseur10a2 = "1" & base


Merci beaucoup d'avoir prit le temps d'y répondre

PS : Je suis débutant donc pourriez vous me proposer des réponses sans fonctions complexes.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

5 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
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 :
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.
1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
23 févr. 2022 à 23:16
J'obtiens "110010001" pour 401 sur les macros de LibreOffice avec ce code :

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
1
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
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.
0
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 :

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.
0

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 ?
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
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.
0