VBA - Conversion décimal en Binaire

Julien87 -  
NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    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
  2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    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
  3. Julien87
     
    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
    1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      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
  4. Julien87
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Julien87
     
    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
    1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      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