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. 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
      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.
    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.
      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. D'accord super merci, le code marche bien.

          J'aurais juste une dernière question.

          Je ne comprend pas vraiment à quoi sert le ByVal ?
          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.