Recherche dans une chaine de caractère + extraction de la donnée

MERLIN

XLDnaute Junior
Bonjour à toutes et à tous,

Je suis devant une impasse car cette partie d'excel m'est pour l'instant complètement inconnue !
J'ai un tout un fichier à analyser et je dois extraire "une simple donnée", le numéro de téléphone portable contenu dans une chaine de caractères !

J'ai mis un fichier en exemple. J'imagine qu'il doit exister une belle boucle (ça je sais faire) avec une fonction de recherche + extraction (ça je ne sais pas du tout faire).

Un gros merci d'avance à celles et à ceux qui se pencheront sur mon cas.
 

Pièces jointes

  • Extraction du mobile.xls
    24.5 KB · Affichages: 72

job75

XLDnaute Barbatruc
Re Magic_Doctor,

Pour le problème que tu as posé ceci est vraiment très simple et très classique :
Code:
Function ExtractTelPortable$(maChaine$, rang As Byte, sep$, Optional choix As Boolean = True)
'choix = True => 9 chiffres, choix = False => plus de 9 chiffres
Dim i%, s
For i = Len(maChaine) To 1 Step -1
    If Not IsNumeric(Mid(maChaine, i, 1)) And Mid(maChaine, i, 1) <> "&" Then maChaine = Left(maChaine, i - 1) & Mid(maChaine, i + 1)
Next
s = Split(maChaine, "&") 'repérage par le séparateur "&"
If UBound(s) < rang - 1 Then Exit Function
maChaine = s(rang - 1)
Select Case Len(maChaine)
    Case 9: maChaine = IIf(choix, Format(maChaine, "000\ 000\ 000"), "")
    Case Is > 9: maChaine = IIf(choix, "", Format(maChaine, "#00\ 00\ 00\ 00\ 00"))
    Case Is < 9: maChaine = ""
End Select
ExtractTelPortable = Replace(maChaine, " ", sep)
End Function
Seule hypothèse : les numéros de téléphone sont séparés par des "&".

Fichier joint.

A+
 

Pièces jointes

  • N° de téléphone(1).xlsm
    23.2 KB · Affichages: 35

laurent950

XLDnaute Accro
Bonsoir Magic le Forum,
Pas simple mais toutes les combinaisons Fonctionne Si cela fonctionne alors je suis Barbatruc ;-))
en tous cas très interressent super merci à se super Forum.

La fonction / =ExtractTelPortLaurent($C$8;4)

Merci à Magic

VB:
Option Base 1
'Sub Laurent3()
Function ExtractTelPortLaurent(Chaine As String, chx As Integer) As Variant
' initianlisation des variables
'Dim Chaine As String
'Pitaluga a plusieurs Nº de téléphone : 06 66 99      55 76  &  094 54 20 44  &  099    925 301  &  06 300 200 11
        'Chaine = "Pitaluga a plusieurs Nº de téléphone : 06 77 99      55 76  & 06 66 99      55 76  &  094 54 20 44  &  099    925 301  &  06 300 200 11"
' "(([0])([6]\s*)([0-9]{2}\s*){4})" = 06 66 99      55 76
' "(([0])([0-9])([0-9]\s*)([0-9]{2}\s*){3})" = 094 54 20 44
' "(([0])([0-9])([0-9]\s*)([0-9]{3}\s*){2})" = 099    925 301
' "(([0])([6]\s*)([0-9]{3}\s*){2}([0-9]{2}\s*))" =06 300 200 11

TabRch = Array("(([0])([6]\s*)([0-9]{2}\s*){4})", _
                      "(([0])([0-9])([0-9]\s*)([0-9]{2}\s*){3})", _
                              "(([0])([0-9])([0-9]\s*)([0-9]{3}\s*){2})", _
                                       "(([0])([6]\s*)([0-9]{3}\s*){2}([0-9]{2}\s*))")

'*** ------------------------------------------------------------------------------
' Tableau d'objet
Dim Tabreg() As Object
ReDim Tabreg(LBound(TabRch) To UBound(TabRch))
Dim TabMatch() As Object
ReDim TabMatch(LBound(TabRch) To UBound(TabRch))
Dim TabMatches() As Object
ReDim TabMatches(LBound(TabRch) To UBound(TabRch))
'*** ------------------------------------------------------------------------------
    ' Créer un tableau pour stocké les numéros de telephones
        Dim x As Variant
        Dim TabNum() As Variant
            x = 0
            ReDim TabNum(0 To x)
        Dim y As Variant
        Dim TabNumPos() As Variant
            y = 0
            ReDim TabNumPos(0 To y)
'*** ------------------------------------------------------------------------------

For i = LBound(Tabreg) To UBound(Tabreg)
    Set Tabreg(i) = CreateObject("vbscript.regexp")
        ' ici laissé pour l'ordre !
        'Chaine = "Pitaluga a plusieurs Nº de téléphone : 06 66 99      55 76  &  094 54 20 44  &  099    925 301  &  06 300 200 11"
        'Le Pattern est le motif que l'on recherche
        Tabreg(i).Pattern = TabRch(i)
        ' Active ou non la recherche sur plusieurs lignes à la fois / La propriété est mise sur False par défaut.
        Tabreg(i).MultiLine = False
        ' Précise si la recherche est sensible ou non à la casse (majuscules/minuscules) / La propriété est mise sur False par défaut.
        Tabreg(i).IgnoreCase = True
        ' Précise si la recherche porte sur la première occurence ou sur toutes / La propriété est mise sur False par défaut.
        Tabreg(i).Global = True
        'le test renvoie un Boolean (parfait pour notre fonction Booléenne!!!)
        'MsgBox Tabreg(i).test(Chaine)
        ' Cette méthode permet d'explorer les occurences qui vérifient le Pattern.
        Set TabMatches(i) = Tabreg(i).Execute(Chaine)
            For Each TabMatch(i) In TabMatches(i)
               'MsgBox TabMatch(i).Value
                        TabNum(x) = TabMatch(i).Value
                            x = x + 1
                            ReDim Preserve TabNum(0 To x)
              'MsgBox TabMatch(i).firstindex
                        TabNumPos(y) = TabMatch(i).firstindex
                            y = y + 1
                            ReDim Preserve TabNumPos(0 To y)
                'Debug.Print "source >>", TabMatch(i).Value
                    'For j = 0 To TabMatch(i).SubMatches.Count - 1
                        ' Debug.Print "[$" & j + 1 & "]", TabMatch(i).SubMatches(j)
                        'Debug.Print TabRch(i), TabMatch(i).SubMatches(j)
                'Next j
            Next TabMatch(i)
Next i
'*** ------------------------------------------------------------------------------
    ' Transfer des deux tableaux une dimension dans le tableau final
    Dim TabFinal() As Variant
    ReDim TabFinal(LBound(TabNum) To UBound(TabNum) - 1, 0 To 2)
    'MsgBox UBound(TabNum) - 1
        For i = LBound(TabFinal) To UBound(TabFinal)
            ' Numéro de telephone
                TabFinal(i, 0) = TabNum(i)
            ' Position dans la chaine
                TabFinal(i, 1) = TabNumPos(i)
        Next i
' Fuction
' Tri d'un tableau (Array) à 2 dimensions
' ici sur la colonne 1
    Tri TabFinal(), 1, LBound(TabFinal, 1), UBound(TabFinal, 1)
'*** ------------------------------------------------------------------------------

' Ordre des numéro de téléphonnes dans la chaine de caractéres
    cpt = 1
    For i = LBound(TabFinal) To UBound(TabFinal)
        ' Position dans la chaine
            TabFinal(i, 2) = cpt
            cpt = cpt + 1
    Next i
'*** ------------------------------------------------------------------------------
' Resultat
'MsgBox chx - 1
'MsgBox TabFinal(chx - 1, 0)
'*** ------------------------------------------------------------------------------
'Remplace les espaces doubles (voire davantage) par un seul espace
'Exemple : SingleSpaceBetweenWords("03   55  21 13) ---> 03 55 21 13
' Function de Magic
    Do While InStr(1, TabFinal(chx - 1, 0), "  ") > 0
        TabFinal(chx - 1, 0) = Replace(TabFinal(chx - 1, 0), "  ", " ")
    Loop
'*** ------------------------------------------------------------------------------
ExtractTelPortLaurent = Trim(TabFinal(chx - 1, 0))
End Function

Sub Tri(a(), ColTri, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2, ColTri)
  g = gauc: d = droi
  Do
    Do While a(g, ColTri) < ref: g = g + 1: Loop
    Do While ref < a(d, ColTri): d = d - 1: Loop
    If g <= d Then
       For k = LBound(a, 2) To UBound(a, 2)
         temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
       Next k
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, ColTri, g, droi)
  If gauc < d Then Call Tri(a, ColTri, gauc, d)
End Sub

Ps : Magic j'ai fais le choix de faire des patterns lisibles (avec cela vous pouvez faire autant de combinaisons que possible et tous récupérer une sorte de super recherche, pour le tris quick short j'y suis aller un peux vite au plaisir de vous lire

Laurent950
 

Pièces jointes

  • Pattern Forum (Laurent final).xlsm
    30.7 KB · Affichages: 39
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonsoir job,

Ta fonction est intéressante. Mais depuis le postage de ma requête, les choses ont évolué.
J'avais complètement oublié que tous les Nº de téléphone en France commencent par "0".
Les Nº de portables (toujours en France) commencent eux par "06" ou "07". Je raisonnais à l'"uruguayenne".
Il semblerait qu'en France vous allez atteindre des Nº allant jusqu'à 14 chiffres !

https://fr.wikipedia.org/wiki/Liste_des_préfixes_des_opérateurs_de_téléphonie_mobile_en_France

En Uruguay, c'est calme ; depuis 1 siècle ils stagnent à environ 3 millions d'habitants... Donc peu de chance qu'il y ait une inflation de chiffres dans les Nº de téléphones ici avant longtemps.

Pour m'amuser, je me suis dit que, suivant le Nº de portable, on pourrait identifier l'opérateur (Orange, Free...), mais après lecture en diagonale de l'article ci-dessus, en raison des Nº dits "portés", impossible de savoir avec certitude qui est qui. Donc je laisse tomber.

Le plus intéressant dans cette histoire (en faisant abstraction d'Hildegarde...), c'est de pouvoir facilement distinguer dans une liste les Nº de portables des Nº de postes fixes.
Quant à savoir si c'est vraiment utile... Pas plus inutile que ceux qui s'escriment à rédiger une macro permettant de gérer une cave à vin où au final il n'y aura toujours que 2 bouteilles de Sidi Brahim...

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 184
dernier inscrit
Di Martino