Insérer espace après nombres dans chaine de caractères [Résolu]

cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention - 7 janv. 2009 à 08:14 - Dernière réponse : cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

cs_fauve 661 Messages postés vendredi 2 décembre 2005Date d'inscription 23 mars 2011 Dernière intervention - 8 janv. 2009 à 13:52
+3
Utile
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 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_fauve
pile_poil 682 Messages postés vendredi 6 avril 2007Date d'inscription 4 août 2012 Dernière intervention - 7 janv. 2009 à 10:49
0
Utile
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
Commenter la réponse de pile_poil
cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention - 7 janv. 2009 à 11:53
0
Utile
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
Commenter la réponse de cs_enemme
cs_fauve 661 Messages postés vendredi 2 décembre 2005Date d'inscription 23 mars 2011 Dernière intervention - 7 janv. 2009 à 15:25
0
Utile
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 
Commenter la réponse de cs_fauve
jmf0 1566 Messages postés mardi 26 décembre 2000Date d'inscription 5 avril 2013 Dernière intervention - 7 janv. 2009 à 15:46
0
Utile
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
Commenter la réponse de jmf0
cs_fauve 661 Messages postés vendredi 2 décembre 2005Date d'inscription 23 mars 2011 Dernière intervention - 7 janv. 2009 à 15:59
0
Utile
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 
Commenter la réponse de cs_fauve
cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention - 8 janv. 2009 à 11:45
0
Utile
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.
Commenter la réponse de cs_enemme
cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention - 9 janv. 2009 à 09:27
0
Utile
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 !!!
Commenter la réponse de cs_enemme
cs_enemme 7 Messages postés dimanche 27 mars 2005Date d'inscription 12 janvier 2009 Dernière intervention - 9 janv. 2009 à 09:35
0
Utile
Heu désolé, j'ai en fait trouver la solution.....Je te remerice encore et j'accepte ta réponse

Merci encore !!!!
Commenter la réponse de cs_enemme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.