VBA - Conversion décimal en Binaire

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. Modérateur
    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
    1. Modérateur
      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
      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
        1. Modérateur
          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
      2. 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
        1. 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. Modérateur
            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