Ajout ligne / conversion [Résolu]

Signaler
Messages postés
9
Date d'inscription
samedi 10 novembre 2007
Statut
Membre
Dernière intervention
18 novembre 2007
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tous et déjà un grand merci aux éventuelles réponses ;)
Je
voudrai, sous VBA, pouvoir ajouter une ligne toutes les 2 lignes a
partir d'un fichier Excel puis dans cette nouvelle ligne, faire
quelques opérations, telle une conversion binaire d'un nombre qui se
touverait alors dans la ligne juste au dessus.
EX:
une ligne avec 6 colonnes ....
-> ajout nouvelle ligne + conversion en binaire de la cellule (1ere ligne / 2eme colonne par exemple)
ex : j'ai un nombre 9841215 et je devrai trouver 10001100101 (ex au hasard je n'ai pas vérif)
Etant plus que débutant en prog sous VBA, je ne connais pas trop la syntaxe pour ce genre d'opéarations.

voilà j'espere avoir bien exposé mon problème.
Merci.

1 réponse

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Je recommence puisque tu n'as pas compris :
Le VB de Excel est du VBA --> Il y a un thème pour ces questions, merci de la classer correctement la prochaine fois

Insérer une ligne, je le répète encore une fois aussi : Tu sais le faire à la main, donc enregistre une macro pendant que tu le fais à la main et va voir dans le code de la macro à quelle instruction cela correspond.

Ta deuxième question (*) concerne la transformation d'un décimal en binaire :
Excel ne possède pas de fonction de cenversion directe, il va falloir le coder toi même.
Il faut, pour y arriver, que tu saches comment on passe de l'un à l'autre, ensuite ce n'est qu'une histoire de programmation.
Renseigne-toi la dessus ou révise tes cours parce que le code que je vais te passer fonctionnera peut-être, mais tu n'auras rien appris en l'utilisant sans comprendre.

Function ConvertBase(sNombreOriginal As String, _
                                    iBaseOrigine As Integer, _
                                    iBaseFinale As Integer) As String
     ' Convertit un nombre d'une base (2 à 36) vers une autre base (2 à 36)    ' (Binaire Base 2, Octal Base 8, Décimal = Base 10, Hexadécimal = Base 16)
    '   sNombreOriginal est le nombre a convertir (chaine composée de 0-9, A-Z)
    '   iBaseOrigine est la base correspondant à sNombreOriginal (un entier entre 1 et 36)
    '   iBaseFinale est la base dans laquelle le nombre doit être rendu (un entier entre 1 et 36)
    ' Renvoie une chaîne dans la base désirée (chaine composée de 0-9, A-Z)
    '   (Exemple ConvertBase ("42", 8, 16) convertit 42 (octal) en 22 (hexadécimal)
    ' Si la conversion ne peut se faire, ConvertBase renvoie un texte désignant le
    '    caractère incorrect
    Dim i As Integer
    Dim sCaractèreCourant As String
    Dim iCaractèreValeur As Integer
    Dim iEmplacement As Integer
    Dim dTotal As Double
    Dim dMémoire As Double
    Dim dBaseSortie As Double
    Dim sTemp As String    If sNombreOriginal "" Then sNombreOriginal "0"
    ' On s'assure que la base entrée est exploitable
    If iBaseOrigine < 2 Or iBaseOrigine > 36 Or _
        iBaseFinale < 2 Or iBaseFinale > 36 Then
        ConvertBase = "Erreur : Base sélectionnée invalide."
        Exit Function
    End If
    ' Transforme les caractères en majuscule
    sTemp = UCase$(sNombreOriginal)
    iEmplacement = Len(sTemp)
    For i = 1 To Len(sTemp)
        iEmplacement = iEmplacement - 1
        sCaractèreCourant = Mid$(sTemp, i, 1)
        iCaractèreValeur = 0
        If Asc(sCaractèreCourant) > 64 And _
            Asc(sCaractèreCourant) < 91 Then _
            iCaractèreValeur = Asc(sCaractèreCourant) - 55
        If iCaractèreValeur = 0 Then
            ' On s'assure que sNombreOriginal est exploitable (global)
            If Asc(sCaractèreCourant) < 48 Or _
                Asc(sCaractèreCourant) > 57 Then
                ConvertBase = "Erreur : Caractère """ & sCaractèreCourant & """ invalide."
                Exit Function
            Else
                iCaractèreValeur = Val(sCaractèreCourant)
            End If
        End If
        If iCaractèreValeur < 0 Or iCaractèreValeur > iBaseOrigine - 1 Then
            ' On s'assure que sNombreOriginal est exploitable (en fonction de la base)
            ConvertBase = "Erreur : Caractère """ & sCaractèreCourant & _
                            """ non valide en Base" & Str(iBaseOrigine) & "."
            Exit Function
        End If
        dTotal = dTotal + iCaractèreValeur * (iBaseOrigine ^ iEmplacement)
    Next i
   ' Convertit la valeur Decimale par divisions successives
    Do
        dBaseSortie = CDbl(iBaseFinale)
        dMémoire = ModDouble(dTotal, dBaseSortie)
        dTotal = (dTotal - dMémoire) / iBaseFinale
        If dMémoire >= 10 Then
            sCaractèreCourant = Chr$(dMémoire + 55)
        Else
            sCaractèreCourant = Right$(Str$(dMémoire), Len(Str$(dMémoire)) - 1)
        End If
        ConvertBase = sCaractèreCourant & ConvertBase
        DoEvents
    Loop While dTotal > 0
End Function



Function ModDouble(sNombreOriginal As Double, DivNum As Double) As Double
   ModDouble = sNombreOriginal - (Int(sNombreOriginal / DivNum) * DivNum)
End Function


Et pour l'exploiter :
   maCelluleBinaire = ConvertBase(maCelluleDécimale, 10, 2)

(*) On demande pourtant dans le règlement de ne poser qu'une seule question par post afin, justement, d'éviter d'avoir à répondre à des questions que tu as peut-être déjà résolu comme l'insertion d'une ligne.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés





<hr />

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)