extraire caractere delimites par /

  • Initiateur de la discussion anna
  • Date de début
A

anna

Guest
Re bonjour le forum
c un peu plus complique cette fois mais voila comment extraire les caractere qui sont dans une chaine a longeur differente selon les champ et qui sant delimite par des /
exemple
colonne A
CCL/830/LTA
CCL/8301/LTA/MMA
CCL/830/LTA
CCL/8206

le resultat sera
colonne A
830
8301
830
8206


Merci d'avance a tous ceux qui m aideront (les autre aussi ;) )
 
A

anna

Guest
Re bonjour
Oui excuse moi j aii pas preciser
Macro
Oui toujour 3 lettre au debut
et ca peut arrive qu il n y a pas de / a la fin comme la dernier ligne mais c rare et dans ce cas on peut faire un right (cells(i,j),4)
suis je claire?
Merci bcq
Anna
 

2passage

XLDnaute Impliqué
Bonjour,

ca ca devrait marcher :

Private Sub CommandButton1_Click()
Dim X, slash1, slash2 As Integer
Dim ChaineRetour As String
Do While ActiveCell.Text <> ''
slash1 = InStr(ActiveCell.Text, '/')
slash2 = InStr(slash1 + 1, ActiveCell.Text, '/')
If slash2 = 0 Then slash2 = Len(ActiveCell.Text)
ChaineRetour = Mid(ActiveCell.Text, slash1 + 1, slash2 - slash1 - 1)
ActiveCell.Value = ChaineRetour
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

sans trop de garantie.... (pas trop de temps pour tester, là)


++

edit : oops , mode d'emploi : coller le code sur un bouton, se placer dans la premiere cellule de la colonne et cliquer. Ca descend tant que ca trouve des valeurs

Message édité par: 2passage, à: 10/06/2005 16:27
 

Creepy

XLDnaute Accro
Hello all,

Voici un exemple en PJ

++

Creepy

EDIT : Avec la PJ c'est mieux !! :p [file name=classeur1_20050610163255.zip size=9314]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeur1_20050610163255.zip[/file]

Message édité par: Creepy, à: 10/06/2005 16:32
 

Pièces jointes

  • classeur1_20050610163255.zip
    9.1 KB · Affichages: 32

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Anna, Ândré, Creepy, 2passage, le Forum

Uniquement si Anna est au moins sous Excel 2000 (Car la Function Split ne passera pas sous Excel 97), voici un autre approche :

Sub TheSlashExtractor()
Dim Plage As Range, Cell As Range
Dim Container As Variant
Dim NomComplet As String, NomSeul As String

Set Plage = Range('A1:A20') 'à adapter
&nbsp; &nbsp;
&nbsp; &nbsp;
For Each Cell In Plage
&nbsp; &nbsp; &nbsp; &nbsp; NomComplet = Cell
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; Container = Split(NomComplet, Chr(47))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If UBound(Container) > 0 Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NomSeul = Container(1)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cell = NomSeul
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next Cell
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;
End Sub

Sinon sous Excel 97, il faudra donc jongler comme Creepy et 2passage entre les fonctions 'Instr' et 'Mid'

Bon Après Midi
@+Thierry
 

jeromegmc

XLDnaute Occasionnel
Voici la fonction à coller dans un module, après tu insères la fonction personalisée 'monnombre' sous excel en choisissant la cellule qui contient le texte:

Ca marche pour tes 4 exemples après adapte un peu! :)

Function monnombre(montexte)
'Dim montexte
Dim i
Dim Malettre
Dim first_
Dim second_
Dim mystart
Dim myend

'Dim monnombre
i = 1
'montexte = Range('A1').Value

Do Until Malettre = '/'
Malettre = Mid(montexte, i, 1)
If Malettre <> '/' Then
i = i + 1
ElseIf Malettre = '/' Then
first_ = i
End If
Loop


i = i + 1
Malettre = Mid(montexte, i, 1)
Do Until Malettre = '/' Or i = 15
Malettre = Mid(montexte, i, 1)
If Malettre <> '/' Then
i = i + 1
ElseIf Malettre = '/' Then
second_ = i
End If
Loop


If i = 15 Then
myend = '15'
ElseIf i <> 15 Then
myend = second_ - first_ - 1
End If
mystart = first_ + 1

monnombre = Mid(montexte, mystart, myend)

'Variable = MsgBox(monnombre, 48, rien)
End Function


A+ et que le meilleur l'emporte, merci de dire quelle méthode tu retiens et pourquoi, histoire d'aprendre des choses
:)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Jerome, re le Fil

Je ne suis pas à 100% d'accord avec toi. En effet contrairement aux apparences, le code de Creepy containt une faille, si jamais la chaine de caractères de la première fraction est différente de 4 digits...

Exemple :
CCL/830/LTA
CL/8301/LTA/MMA
CAAAL/8204

Retournera :
830
301
L

Alors que le code de 2ePassage le gère bien. Quand à la fonction, Split, elle ne se soucit absolument pas du nombre de digits, ni avant, ni après, ni pendant !!! lol

Bon Après Midi
@+Thierry
 

Hellboy

XLDnaute Accro
Bonjout a tous

Je suis d'accord avec _Thierry. En passant _Thierry, se pourrait-il que le IF ne serait pas nécessaire ? Genre ceci pourrait faire l'affaire aussi ?



Code:
For Each Cell In Plage
        Container = Split(Cell, Chr(47))
        Cell = Container(UBound(Container))
    Next Cell
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour les amis, le Forum

Et oui, en effet Anna a bien écrit en réponse à mon ami Ândré, qu'il y avait 'Oui toujour 3 lettre au debut', bien qu'elle ait précisé dans son tout premier Post 'qui sont dans une chaine à longeur differente selon les champs'

Donc Creepy tu n'es pas du tout 'mauvais' dans ta proposition, mais en tant que développeur, je te donnerais un conseil tout simple :

Si la demande de l'utilisateur consiste par exemple :
'J'aurai besoin d'un traitement sur une centaine de codifications'
=> si on ne peut pas traîter directement 'l'infini' Prévoir minimum 1000 'Keys'
'J'aurai que trois lettre au début'
=> si on ne peut pas traîter directement tous les cas de figures, prévoir une gestion d'anomalie(s) dans le traitement.


Pour Hellboy, oui on peut directement placer la Function Split sans gestion d'erreur, mais par contre le retour du 'Ubound' de ce tableau est fondamentalement faux par rapport à la demande d'Anna, regarde ceci :

CCL/8206
CCL/8301/LTA/MMA
CCL/830/LTA
CCL/83023/LTA
CCL/82032

Retour par Cell = Container(UBound(Container))
8206
MMA
LTA
LTA
82032

Ce qui n'est pas le résultat attendu...

Pour conclure, voilà ce que je propose, toujours avec Split, (donc à partir d'Excel 2000, only)

Sub TheSlashExtractorWithAlert()
Dim Plage As Range, Cell As Range
Dim Container As Variant
Dim StringComplet As String, StringSeul As String
Dim Alert As String

Set Plage = Range('A1:A' & Range('A65536').End(xlUp).Row)
&nbsp; &nbsp;
&nbsp; &nbsp;
For Each Cell In Plage
&nbsp; &nbsp; &nbsp; &nbsp; StringComplet = Cell
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; Container = Split(StringComplet, Chr(47))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If UBound(Container) > 0 Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StringSeul = Container(1)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cell = StringSeul
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Alert = Alert & Cell.Address(0, 0) & vbTab & StringComplet & vbCrLf & vbTab
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cell.Interior.ColorIndex = 3
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next Cell
If Len(Alert) > 0 Then
&nbsp; &nbsp; MsgBox 'Les Cellules suivantes n
'ont pas pu être traïtées' & vbCrLf & vbTab & Alert, vbCritical
End If
End Sub

Comme ceci, Anna devrait pouvoir être tranquille... Au fait où est Anna ?

Bon Week End
@+Thierry
 

andré

XLDnaute Barbatruc
Salut à vous,

Pour ceux que cela pourrait intéresser, voici une formule qui répond à la demande :

=STXT(A1;CHERCHE('/';A1;1)+1;CHERCHE('/';A1&'/';CHERCHE('/';A1;1)+1)-CHERCHE('/';A1;1)-1)

Il a été tenu compte de la remarque (oh combien justifiée, de mon ami Thierry) : le nombre de lettres avant le premier / n'a aucune importance.

Ândré.
 

Discussions similaires

Statistiques des forums

Discussions
312 745
Messages
2 091 579
Membres
105 002
dernier inscrit
Calaf