Encore un code postal

francoisexcel

XLDnaute Nouveau
Encore un code postal (résolu)

Bonjour à tous et toutes...
J'ai cherché un peu partout ici et ailleurs sans trouver de réponse qui me satisfasse et surtout qui marche d'ou ma demande d'aide...:confused:
Alors voila dans une cellule j'ai a peu pres n'importe quoi avec a l'intérieur un code postal a 5 chifffres (seule chaine de caractere à 5 chiffres)
Je cherche a extraire ce CP dans une autre cellule afin de pouvoir les exploiter pour en faire des filtres...
J'ai essayer pas mal de chose sans succès... même en travaillant les cellules pour supprimer tout caractere spécial et ensuite convertir j'arrive a isoler mes cp mais ils sont dans des colonnes différentes donc inexploitables...
J'ai 3000 lignes et je me vois pas me les faire à la mano sinon pourquoi excel aurait été inventé???:D

D'avance un grand merci pour vos réponses...
PS ce qui me complique aussi ma réflexion c'est que ma version est en anglais...
voili voilou:)
 
Dernière édition:

mth

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour,

Un petit essai avec ce code, à adapter à ta feuille:
Code:
Sub Macro1()
Dim i As Byte
Dim C As Range
 
With Sheets("Feuil1")
    For Each C In .Range("a1:a" & .[A65000].End(xlUp).Row)
 
        For i = 1 To Len(C)
            If IsNumeric(Mid(C, i, 5)) Then
                C.Offset(0, 1) = Mid(C, i, 5)
            End If
        Next i
    Next C
End With
End Sub

Bien à toi,

mth
 

francoisexcel

XLDnaute Nouveau
Re : Encore un code postal

mth
Merci de ta réponse ca marche presque, seulement il ne me prend que 4 chiffres au lien de 5??? j'ai essaye de passer len 6 mais il me prend le caractere d'apres... Ex ezraz 95570 Bouffémont dsfdf donne 5570 ou 5570 B
Tibo je traduit les termes et je test merci
 

JNP

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour le fil :),
Un petit coup de RegExp :p.
En Sub
VB:
Sub Test()
Dim Cellule As Range, Match, Matches
With Sheets("Feuil1")
For Each Cellule In .Range("A1:A" & .Range("A65000").End(xlUp).Row)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\d\d\d\d\d"
Set Matches = .Execute(Cellule.Text)
If Matches.Count >= 1 Then Cellule.Offset(0, 1) = Matches(0)
End With
Next
End With
End Sub
ou en Function
VB:
Function ExtractionCP(Cellule As Range) As String
Dim Match, Matches
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\d\d\d\d\d"
Set Matches = .Execute(Cellule.Text)
If Matches.Count >= 1 Then ExtractionCP = Matches(0)
End With
End Function
Bonne journée :cool:
 
Dernière édition:

francoisexcel

XLDnaute Nouveau
Re : Encore un code postal

Bon bah Tibo la formule me donne nu #Name? apres traduction :eek:(
Les 3 lignes suivantes sont des exemples de data présents dans une cellule

. 11 RUE JEAN MERMOZ BP 149 - 78500 Sartrouville
17, rue Charles-Edouard Jeanneret Le Technoparc 78306 POISSY Cedex - France
Chemin des Luzernes 95110 Sannois
Comme vous pouvez le voir rien n'est formaté...
voili voilou
 

david84

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour à tous,
je remercie le winner d'avoir la gentillesse de m'expliquer sa macro à un néophyte comme moi :
Sub Test()
Dim Cellule As Range, Match, Matches
With Sheets("Feuil1")
For Each Cellule In .Range("A1:A" & .Range("A65000").End(xlUp).Row)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\d\d\d\d\d"
Set Matches = .Execute(Cellule.Text)
If Matches.Count >= 1 Then Cellule.Offset(0, 1) = Matches(0)
End With
Next
End With
End Sub

Rôle et utilisation de
Match, Matches
Match : est-ce la fonction (si c'est cela, j'ai compris son utilité):)
Matches : là par contre, je ne sais pas:rolleyes:
Global = True
j'interprète cela comme le fait de traiter l'intégralité du contenu de la cellule : est-ce cela ?
Pattern = "\d\d\d\d\d"
Si je reprends ton tutoriel qui dit "de d (digit) correspond à un chiffre équivalent de la classe [0-9]", je me dis que tu recherches un groupe de 5 nombres...
Set Matches = .Execute(Cellule.Text)
Là je ne comprends pas la construction cette phrase (je me dis que tu lances le traitement en allant extraire au sein de chaque cellule le pattern défini mais même si c'est cela, je n'arrive pas à la comprendre):(.
Merci;)
 

JNP

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour David :),
je remercie le winner d'avoir la gentillesse de m'expliquer sa macro à un néophyte comme moi
Ah, les joies de RegExp :p...
Match : j'ai oublié de l'ôter, il me servait à décrire la collection Matches :eek:...
Je vais plutôt reprendre dans l'ordre ;).
Global : théoriquement, j'aurais du le mettre en False. En réalité, c'est pour définir si la recherche s'arrête à la première occurence, ou cherche toutes les occurences. Mais en laissant Global en True, il suffit de modifier la fonction pour qu'il renvoie un tableau utilisable en matriciel, pour récupérer toutes les occurences :eek:.
Pour le Pattern, c'est ce qu'on appelle un Motif. Chaque fois qu'il tombera sur 5 chiffres, il les mettra dans la collection Matches. Mais attention, ça veux dire que s'il y a 6 chiffres ou plus, il n'en traitera que 5...
Enfin le .Execute fait appel au RegExp et fait la recherche. Il existe aussi .Test qui va dire si le motif est trouvé et .Replace qui va faire un remplacement dans la chaîne.
Je sais pas si c'est plus clair :D.
A + :cool:
 

hoerwind

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour à vous tous,

Un essai par formule en pièce jointe.

J'ai eu du mal avec la chaîne de caractères en ligne 1 !
En remplaçant les espaces par un autre caractère cela semble fonctionner.
A tester quand même sur une plus grande échelle.
 

Pièces jointes

  • CodePostal.xls
    15.5 KB · Affichages: 213

francoisexcel

XLDnaute Nouveau
Re : Encore un code postal

hoerwind
Pour info a grande echelle ca passe sauf sur quelques cellules.. exemple
AVENUE DES CHAMPS-ELYSÉES 66 / FR-75008 PARIS donne -7500
153, faubourg Saint-Honoré 75008 Paris donne 153
49/53, rue Salvador Allende 95870 BEZONS - donne #value!
Comme ca si tu savais pas quoi faire... :)
cdt
 

MJ13

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour à tous

Sinon, vous pouvez tester cette fonction:

Function trouveCP(cel As Range)
'MJ
ncar = 5
inc = 0
'MsgBox Len(cel)
For i = 1 To Len(cel)
'Stop
If IsNumeric(Mid(cel, i, 1)) Then inc = inc + 1 Else inc = 0
If inc = ncar Then GoTo suite
Next
suite:
trouveCP = Mid(cel, i - ncar + 1, ncar)
End Function
 

hoerwind

XLDnaute Barbatruc
Re : Encore un code postal

Bonjour, salut les autres,

Pour la première et la troisième chaîne de caractères données sous le message #12, il me semble (je n'en suis pas sur !), qu'Excel interprète le "-" devant un nombre comme un signe négatif et le "/" entre deux nombres comme une fraction.
En substituant également ces deux caractères le problème semble résolu.

Quant à la deuxième chaîne de caractères, je n'y vois aucun problème, peut-être un oubli de validation matricielle ?

Quant à la signification du "µ" dans la formule, il s'agit d'un caractère quelconque, hormis ceux qui posent problème ("-" et "/").
Il a été choisi parce que près du pavé numérique, mais après essais je vois que le "*" fonctionne tout aussi bien.

Si il y a encore un message d'erreur, il faut rechercher le caractère qui pose problème et le substituer également.

Voir la pièce jointe.
 

Pièces jointes

  • CodePostalV2.xls
    16.5 KB · Affichages: 168

Statistiques des forums

Discussions
312 108
Messages
2 085 380
Membres
102 876
dernier inscrit
BouteilleMan