cs_debutantvba
Messages postés9Date d'inscriptionsamedi 10 novembre 2007StatutMembreDernière intervention18 novembre 2007
-
11 nov. 2007 à 10:06
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
11 nov. 2007 à 20:09
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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 11 nov. 2007 à 20:09
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)