VBA + compter

  • Initiateur de la discussion Julien
  • Date de début
J

Julien

Guest
Bonjour à tous,

Ma requête est peut-être un peu bizarre, c'est la raison pour laquelle je n'ai rien trouvé dans les archives du forum.

En fait, je dispose d'une colonne de chiffres et/ou lettres. Je souhaiterais compter chaque cellule de la colonne afin de déterminer le nombre de caractères contenues dans la cellule. Si le nombre de caractère est inférieur au nombre stipulé dans ma cellule K1 (soit 8 dans le cas présent), je souhaiterais ajouter autant de 0 que nécessaire en dernière position de ma cellule pour parvenir à mon nombre de 8 caractères.

Ex :

Colonne A

12345
123456

Je souhaiterais obtenir 12345000 et 12345600.


Merci par avance.
 
J

Jean-Marie

Guest
Re

Public Sub toto()
Dim I, J As Long
Application.ScreenUpdating = False ' pour la rapidité on désactive l'actualisation de l'écran

For I = 1 To Worksheets("Feuil1").Range("A65536").End(xlUp).Row
J = Len(Cells(I, 1).Value)
If J < 8 Then
If IsNumeric(Cells(I, 1)) Then
Cells(I, 1) = Cells(I, 1) * (10 ^ (8 - J))
Else
Cells(I, 1) = Mid(Cells(I, 1) & "00000000", 1, 8)
End If
End If
Next I

Application.ScreenUpdating = True 'l'actualisation de l'écran est réactivée

End Sub
@+Jean-Marie
 
J

Julien

Guest
Bonjour Jean-Marie,

Merci bcq pour ta réponse si rapide. J'essaie de comprendre ton code.

Par contre est-il possible d'ajouter qq chose comme :

If IsNumeric(Cells(I, 1)) or IsAlphanumericCells(I, 1)) Then...

car parfois je suis amené à avoir des chaînes du type 26A88 etc...

Dernière requête afin de ne pas appliquer le code bêtement. Pourrais-tu m'expliquer les lignes suivantes stp :

Cells(I, 1) = Cells(I, 1) * (10 ^ (8 - J))
Else
Cells(I, 1) = Mid(Cells(I, 1) & "00000000", 1, 8)


Merci encore .
 
J

Jean-Marie

Guest
Re...

Pour ce qui des valeurs numériques, le symbole ^ est égale à la mise à la puissance, donc 10^2 = 100 ; 10^2 = 1000 ; 10^4= 10000; etc. Ce qui ramène à faire multiplication

Pour les valeur alphanumérique, il faut faire ce que l'on appelle une concaténation, on prendre une chaîne de caractères on y rajoute une deuxième chaîne, etc. Puis par l'instruction Mid on coupe la chaîne à la longueur voulue.

Tu peux voir une différence d'écriture entre le code VBA et de la formule A1&STXT("00000000";1;8-NBCAR(A1)) fait la même chose que Mid(Cells(I, 1) & "00000000", 1, 8), à une différence près, il y a une opération de soustraction en moins.
On pourrait aussi éviter de la faire dans la formule en l'écrivant
=SI(ESTNUM(A1);A1*(10^(8-NBCAR(A1)));STXT(A1&"00000000";1;8))
Je n'ai vu cette simplification qu'au moment de l'écriture du code VBA. Pour la petite histoire.

@+Valeur
 
J

Julien

Guest
Re Jean-Marie,

Dernière question,

Le code marche très bien avec la colonne A.
Mais je souhaiterais faire la même chose sur la colonne C (sur la même feuille que A).
Donc j'ai réadapté ton code comme ceci :

For I = Range("C5") To Range("C50").End(xlUp).Row
J = Len(Cells(I, 1).Value)
If J < 8 Then
If IsNumeric(Cells(I, 1)) Then
Cells(I, 1) = Cells(I, 1) * (10 ^ (8 - J))
Else
Cells(I, 1) = Mid(Cells(I, 1) & "00000000", 1, 8)
End If
End If
Next I

Mais cela ne marche pas.

Où me suis trompé ?


Merci.
 
S

salim

Guest
Bonjour le Julien, Jean Marie et le Forum

Bonjour Julien tu peux essayer ce code cela devrait fonctionner

Dim i As Byte
Dim j As Byte
For i = 1 To Range("C50").End(xlUp).Row
j = Len(Cells(i, 3).Value)
If j < 8 Then
If IsNumeric(Cells(i, 1)) Then
Cells(i, 3) = Cells(i, 3) * (10 ^ (8 - j))
Else
Cells(i, 3) = Mid(Cells(i, 3) & "00000000", 1, 8)
End If
End If
Next i
End Sub


@+ Salim
 
J

Julien

Guest
Bonsoir Jean-Marie et le forum,

Après avoir étudié ton code, je me suis demandé quelle était le rôle de la 2è condition. En effet, en enlevant cette 2è condition j'obtiens le même résultat que si je la maintenais :

Public Sub toto()
Dim I, J As Long
Application.ScreenUpdating = False

For I = 3 To Worksheets("Feuil1").Range("A30").End(xlUp).Row
J = Len(Cells(I, 1).Value)
If J < 8 Then
Cells(I, 1) = Cells(I, 1) * (10 ^ (8 - J))
End If
Next I

Application.ScreenUpdating = True

End Sub


Pourrais-tu stp m'éclairer sur ce point ?

Merci.
 
J

Julien

Guest
Re,

Mais bien-sûr, je me réponds à moi même

Cette 2è condition permet de faire tourner le code même s'il existe des chaînes mélangeant chiffres et lettres.

Désolé pour cette question de vrai débutant.
 

Discussions similaires

Réponses
2
Affichages
195

Statistiques des forums

Discussions
312 338
Messages
2 087 396
Membres
103 537
dernier inscrit
alisafred974