XL 2016 Formule pour récupérer un code postal

vivi21

XLDnaute Occasionnel
Bonjour,

J'ai une cellule comportant l'adresse complète d'une structure et je souhaiterais récupérer le code postal qui se trouve dans la cellule.
Voici quelques exemple de certaines cellules :

15 RUE DE LA CHARME
21800 CHATILLON EN BAZOIS

ou autre exemple :
3 RUE DE LA SAGESSE
21450 EPOIS
 

kiki29

XLDnaute Barbatruc
Re, une version VBA à tester plus à fond ... à toi de voir, il y a peut-être plus simple (?) via RegExp.
VB:
Sub Test_cp_03()
Dim cpt As Long
Dim bTrouve As Boolean
Dim sStr As String, sCh As String
Dim LastRow As Long, i As Long

    LastRow = Feuil1.Range("A" & Rows.Count).End(xlUp).Row

    bTrouve = False
    sCh = ""

    For i = 1 To LastRow
        sStr = Feuil1.Range("A" & i).Text
        For cpt = 1 To Len(sStr)
            Select Case Mid(sStr, cpt, 1)
            Case "0" To "9"
                bTrouve = True
                sCh = sCh & Mid(sStr, cpt, 1)
            Case " ", Chr(13), Chr(10):
                If bTrouve Then
                    If Len(sCh) = 5 Then
                        Feuil1.Range("B" & i).Value = Mid(sStr, cpt - 5, 5)
                    End If
                    bTrouve = False
                    sCh = ""
                End If
            End Select
        Next cpt
    Next i
End Sub
 

Pièces jointes

  • 1.png
    1.png
    25.1 KB · Affichages: 14
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Puisque kiki29 évoque regexp
Une fonction personnalisée (à utiliser comme une formule)
VB:
Function X_CP(Chaine$) As String
    With CreateObject("vbscript.regexp")
        .Pattern = "\d{5}": X_CP = .Execute(Chaine)(0)
    End With
End Function
Si en A1
15 RUE DE LA CHARME 21800 CHATILLON EN BAZOIS
Cette formule en B1 renvoie 21800
=X_CP(A1)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :) ,

Un essai par formule à compter d'Excel 2016 car il faut disposer de la fonction : Joindre.Texte().
La formule en B2 est matricielle et s'écrit :
VB:
=TEXTE(JOINDRE.TEXTE("";VRAI;SI(ESTNUM(--STXT(SUBSTITUE(SUBSTITUE(A2;CAR(10);"");" ";"");LIGNE(INDIRECT("1:"&NBCAR(SUBSTITUE(SUBSTITUE(A2;CAR(10);"");" ";"x"))));5));--STXT(SUBSTITUE(SUBSTITUE(A2;CAR(10);"");" ";"");LIGNE(INDIRECT("1:"&NBCAR(SUBSTITUE(SUBSTITUE(A2;CAR(10);"");" ";"x"))));5);""));"00000")
Elle est basée sur le fait qu'il n'y aura dans l'adresse qu'un seul nombre à 5 chiffres qui sera donc le code postal. Le code postal peut-être situé n'importe où dans l'adresse.

1687798024763.png
 

Pièces jointes

  • vivi21- extraction CP- v1.xlsx
    10.4 KB · Affichages: 2
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Pour le fun, en bon VBAiste, une fonction purement VBA :
VB:
Function extCP(ByVal xcp) As String       ' mapomme
Dim i&
   For i = Len(xcp) - 4 To 1 Step -1
      If Mid(xcp, i, 5) Like "#####" Then extCP = Mid(xcp, i, 5): Exit Function
   Next i
End Function
Mêmes résultats que la fonction de Staple1600 (que je salue :)).
 

Staple1600

XLDnaute Barbatruc
Re

Pour le fun, en bon flâneur sur les forums anglophones , et pour saluer mapomme ;)
Une formule (qui fonctionne sur 365)
=STXT(A1;TROUVE("0111110";0&CONCAT(--(ESTNUM(-STXT(A1;SEQUENCE(NBCAR(A1));1))))&"0111110");5)

Pas de validation matricielle.
 

Discussions similaires

Réponses
10
Affichages
666
Réponses
1
Affichages
320
Compte Supprimé 979
C

Statistiques des forums

Discussions
314 738
Messages
2 112 334
Membres
111 512
dernier inscrit
Gilles727