Insérer espace après nombres dans chaine de caractères

Résolu
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009 - 7 janv. 2009 à 08:14
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009 - 9 janv. 2009 à 09:35
Bonjour messieurs, dames...

Je viens vers vous aujourdh'ui pour vous demander de l'aide. Je ne suis pas un programmateur né, mais je suis obligé en ce moment de travailler sur excell pour nettoyer des fichiers de saisie.

En cela, je suis obligé de faire respecter à mes textes une série de règles typographiques. J'ai déjà trouver le moyen de rajouter un point en fin de cellule avec une macro.

Mais j'ai besoin d'aide pour éditer une nouvelle macro qui me permettrait d'ajouter un espace entre un grammage et son unité (g ou kg.
exemple : mon fchier est formaté de cette manière 980g ou 80g ou 85g ou 758g ou 2004g ou 2,4kg.
Sachant que ce texte est compris dans une chaine de caractère.

Voila je viens vers vous pour savoir comment m'y prendre. Ne sachant pas vraiment manipuler le VB, je vous demanderai donc une grande indulgence...

Merci beaucoup, cela m'aidera beaucoup.

PS : je pense avoir compris la logique quand même (il faut demander à excel de chercher une chaine numérique comprise entre 1 et infini et de lui insére un espace si le caractère suivant cette chaine est un g ou un k ? non ?

Bonne journée

9 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
8 janv. 2009 à 13:52
Salut,

Voici le code qui pourra rajoutera un espace entre un nombre et son unité de poids :

Ps : Je l'ai bien commenté donc tu devrais pouvoir le comprendre sans aucun problème









' Selectionne la 1° cellule à modifier

Range( "A1" ).Select

' Boucle tant qu'un cellule vide n'est pas
' rencontrée
While  Selection.Value <> ""

     ' On est obligé de faire deux passes
     ' car la boucle For est initialisée
     ' qu'une seule fois.

     ' En effet, si Len(Selection.Value)  = 50
     ' alors la boucle For va aller de 1 à 50
     ' mais si on rajoute des caractères dans
     ' Selection.Value -> Len(Selection.Value)
     ' va aussi changer mais For ira toujours
     ' de 1 à 50

     ' Donc si une unité de poids (g ou kg)se
     ' trouve à la fin de la chaine celle-ci
     ' ne sera pas traité car la boucle For
     ' se sera arrêtée avant.
     For i =   1  To 2
          ' Boucle sur le nombre de caractères
          ' dans Selection.Value
          For nb  = 1 To Len(Selection.Value)
               ' Si on rencontre un chiffre et qu'il est suivi
               ' soit de g ou kg -> on a trouvé un poids où il
               ' faut rajouter un espace entre le grammage et
               ' l'unité de poids               If IsNumeric(Mid(Selection.Value, nb, 1))   True And  (<gras>LCase(Mid(Selection.Value, nb + 11)) </gras>  "g"  Or LCase(Mid(Selection.Value, nb + 12))  =  "kg")  Then
                    ' On modifie Selection.Value pour rajouter un espace
                    Selection.Value  =  Mid(Selection.Value, 1, nb) +  " "  + Mid(Selection.Value, nb + 1)
               End If
          Next
     Next
     ' On passe à la cellule suivante
     Selection.Offset(10).Select
Wend







<hr size ="2" width="100%" />
++

Fauve


Pensez : Réponse Acceptée 
3
pile_poil Messages postés 682 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 août 2012 6
7 janv. 2009 à 10:49
le petit bout de code ci-dessous devrait répondre à ton besoin je suis parti du principe que les textes à modifier étaient dans la colonne 1 et le nouveau texte dans la colonne 2 a toi de modifier la chose pour le faire coller à ton contexte

Sub espace()
Dim nbLignes As Long
Dim i As Long
Dim a As Integer
'pour savoir le nombre de lignes a traiter
nbLignes = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
'boucler jusqu'à la fin des lignes
For i = 1 To nbLignes
    a = InStr(Cells(i, 1), "k") 'pour avoir la position du "k"
    If a =0 Then a = InStr(Cells(i, 1), "g") 'si il n'y en a pas récupérer la position du "g"
    Cells(i, 2) = Left(Cells(i, 1), a - 1) & " " & Mid(Cells(i, 1), a)  'insérer l'espace
Next i
End Sub

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
0
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009
7 janv. 2009 à 11:53
Bonjour,

Merci de m'avoir donné ce bout de code.....
Cependant et je m'excuse d'avoir à te demander cela, mais je ne cherche pas vraiment ni la position du k ou du g, mais plutot un chiffre (de 0 à 9 ) avec un g ou un kg ensuite) c'est à cet endroit que j'aimerais insérer un caractère espace.

Je vais te donner un exemple précis si cela ne te dérange pas :
poids du foie de Mr XXX (725g)

J'aimerais à la fin avoir :
poids du foie de Mr XXX (725 g)

Donc je suppose qu'il faut chercher une chaine ayant : 1 nombre entre 0 et 9 suivi d'un g et d'insérer ensuite l'espace....

Je comprendrais que tu ne veuilles pas plus te pencher pour cela.

Le problème c'est que j'ai un fichier énorme à traiter..

Enfin merci quand même d'avance
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
7 janv. 2009 à 15:25
Salut,

Voici un code qui fonctionne très bien chez moi... Je l'ai assez bien commenté donc si tu éprouves des soucis n'hésites pas à le faire savoir.









' On sélectione la première cellule à modifier

Range( "A1" ).Select

' Boucle tant qu'une cellule n'est pas vide
While  Selection.Value <> ""
     Dim nb As Integer

     ' Boucle sur le nombre de caractères dans la cellule
     ' On part de la fin de la chaine vers le début
     For nb  = Len(Selection.Value) To 1 Step -1
          ' Dés qu'on va rencontrer un chiffre on sait que c'est là qu'il faudra
          ' rajouter un espace
          ' En effet, dans ton exemple, quelque soit le poids indiqué
          ' Le caractère avant l'espace sera toujours le dernier chiffre du poids
          If IsNumeric(Mid(Selection.Value, nb, 1)) =   True Then
               ' On a trouvé le dernier chiffre

               ' On récupère le poids, on ajoute un espace et enfin, on rajoute encore
               ' l'unité du poids
               Selection  = Mid(Selection.Value, 1, nb) +  " "  + Mid(Selection.Value, nb + 1, Len(Selection.Value) - nb)

               ' Permet de quitter immédiatement la boucle For
               Exit For
          End If
     Next

    ' Permet de passer à la cellule suivante (celle en dessous)
    Selection.Offset(10).Select
Wend



<hr size ="2" width="100%" />
++

Fauve


Pensez : Réponse Acceptée 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
7 janv. 2009 à 15:46
Bonjour,

Pas d'accord avec toi, Fauve ....
quid d'un chiffre qui ne précède pas g ou kg ? ===>> il va rajouter un espace indû !
et quid de plusieurs poids sur la même ligne ?

Voilà donc, vite fait et bâclé, un procédé (parmi des milliers d'autres possibles) :

Private Sub Command1_Click()
  toto = "poids du foie de Mr XXX, âgé de 25 ans (725g) et celui de Mme YYYY : 1,3kg. en notant que 1,3kgs est plus lourd que 725g"
  For i = 1 To Len(toto)   If IsNumeric(Mid(toto, i, 1)) And (UCase(Mid(toto, i + 1, 1)) "G" Or UCase(Mid(toto, i + 1, 2)) "KG") Then
     u = u & i + 0 & ","
   End If
  Next
  titi = Split(u, ",")
  For i = UBound(titi) - 1 To 0 Step -1
    toto = Left(toto, Val(titi(i))) & " " & Mid(toto, Val(titi(i) + 1))
  Next
  MsgBox toto
End Sub
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
7 janv. 2009 à 15:59
Ben vu qu'il ne donne pas trop d'infos, je pars dans l'hypothèse que le poids en question a pour lui une cellule à lui tout seul.

C'est pas parce qu'il met :

poids du foie de Mr XXX (725g)

que c'est forcément la même chose dans le fichier excel car moi ce que je ferais ça serait de mettre poids du foie de Mr XXX dans A2 et de mettre 725g dans B2 par exemple. Mais enfin bon il n'a peut être pas procédé de la même façon

Après s'il nous dit comment est exactement la mise en forme dans son fichier excel, on pourra lui proposer un code plus adéquat
Pensez : Réponse Acceptée 
0
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009
8 janv. 2009 à 11:45
Bonjour messieurs,

Je vous remercie du vive interet que vous portez à mon problème....

Alors je m'excuses, mais je n'ai pas eu l'occasion de vous répondre dans la journée d'hier alors j'y vais aujourd'hui....
Pour vous donner un maximum d'informations :
Je possède un fichier excel avec un grand nombre de colonne et d'informations.
L'une d'entre elle et une colonne de description dans laquelle se trouve du texte et des informations de poids.
Cependant ces informations de poids sont tres mal formatées.
En effet l'unité de poids ou de mesure est collé à la mesure (ex : 175g ou 1,2kg).
Cette unité de poids se trouve mélées à d'autre texte et informations.

C'est pour cela que l'idéal (bien que je ne soit pas tres informé sur les formules VBA) serait de chercher un nombre compris entre 1et9 suivi d'une lettre (g ou kg), de trouver chacune de ces occurences et de rajouter un espace entre ces informations.

Je ne sais pas si je suis bien clair.
0
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009
9 janv. 2009 à 09:27
Bonjour fauve,

Je voulais te remercier parce que le code que tu m'as fait fonctionne parfaitement bien...C'est absolument génial...Tu viens de m'enlever une très grosses épine du pied....

Cependant, ton code s'arrete si il rencontre une cellule vide. Or dans la colonne que je doit traiter, j'ai des lignes vides (elle sépare certaines catégories.)
Est-il possible de la supprimer ?
Et je crois que se sera la dernière fois que je t'embeterai.

Je te remercie encore !!!
0
cs_enemme Messages postés 7 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 12 janvier 2009
9 janv. 2009 à 09:35
Heu désolé, j'ai en fait trouver la solution.....Je te remerice encore et j'accepte ta réponse

Merci encore !!!!
0
Rejoignez-nous