Comme demandé, les lignes correspondant à des numéros de téléphone sont les suivantes:
31,32,33,35,36,37,39,42,44,47,48,50,51,56,57,59,60,61
Version imprimable
Comme demandé, les lignes correspondant à des numéros de téléphone sont les suivantes:
31,32,33,35,36,37,39,42,44,47,48,50,51,56,57,59,60,61
donc elle ont bien toute "tel" ou "cel"?????? meme si il y a 2 numero sur la meme ligne
on est d'accord???
La ligne 38 correspond à la reference dune attestation d'identité. Les lignes 41,45,49,53,55 de la capture correspondent aux numéros de pièces d'identité des clients. Il ressort dc que par défaut les utilisateurs saisissent les coordonnées téléphoniques des clients mais lorsque ces dernières ne sont pas disponibles ils saisissent les ref de la pièce d'identité. L'idéal aurait en effet été de réserver un champ pour les coordonnées téléphoniques et un autres pour les ref des pièces d'identité mais hélas. C donc ds ce fourre tout que ma fonction doit pouvoir récupérer ttes les suites numériques qui s'apparentent à des num de tel (succession de 8 chiffres précédée du prefixe cel ou tel ou d'aucun prefixe en dehors de c 2 là)
Elles ont soit tel ou cel soit aucun prefixe.
Cas 1(avec tel) Tel 99.89.99.99/90909090 ou tel:99999999
Cas 2 (avec cel) cel:55555555
Cas 3 sans prefixe: 44444444-45454555.
Pour toutes ces disparités jai choisi ds ma fonction de supprimer tous les caractères spéciaux et d'exploiter
les groupes de caractere de meme type.
la solution que je t'avais donné fonctionnerait très bien dans ce cas
il faut simplement lui ajouter la version sans préfixé
sauf que la il y a un problème
il y a des suite de 8 chiffre qui ne sont pas des tel alors que fait on hein
je te l'ai dis et je te le redis pour la 3eme fois excel et vba ne devine PAS!!!!!!!
soit tu accepte d'en perdre quelque un au passage soit tu fait ca ala main
point barre !!
bonjour,
Une première approche. C'est pas du 100%...
Cordialement,
Philippe
slut pjilben
c'est bien ce que je dis c'est pas du 100%
dans son cas ca n'est pas possible
mais je dois parler chinois
Bonjour
@patricktoulon
Mon objectif n'est pas forcément d'avoir du 100% de récupérer le maximum de "numéros"
repondant aux critères des numéros de téléphone "conformes".
La première approche de pjilben me donne des résultats très interessants.
Merci à vous et à pjilben.
Cela dit je me perds un peu en deroulant la fonction.
Je ne perçois pas très bien l'utilisatio de paramarray.
@pjilben,Pourriez vous m'expliquer la
logique que vous avez implémentée?
Merci
j'ai essayé la version que je t'avais donné j'ai un résultat de 97% sur les dernier exemple de fichier
je vois pas pourquoi tu persiste
enfin c'est toi qui vois
je vais apprendre a parler Français vu que tu ne m'a pas compris :mouarf:
J'ai très bien compris. Pas besoin de prendre des cours de français supplémentaires. :)
Les 97% sont plus que satisfaisants pour moi.
Pourrais-je donc avoir la version finale de votre fonction (celle qui donne 97%)
car la première appliquée à mes données ne me donnait pas un tel résultats.
Merci pour votre aide.
Une autre façon rendue possible grâce à la commande SPLIT.
re
alors voila je me suis intéressé au problème que j'ai cité plus tôt dans mes réponses a savoir excel ne devine pas " c'est un fait
mais il y a des solutions
les premières versions que je t'avais proposé utilisaient la fonction "SPLIT" en post #7
cela dit il y avait forcement des paramètres a prendre en compte qui n'allaient pas avec ce principe
alors j'ai décidé une autre approche
la fonction replace fera tout aussi bien l'affaire et en plus il n'y a pas d'option d'erreur a gérer
j'ai donc procédé comme tel:
1 mise de la colonne B dans une variable tableau , ca change pas par rapport a la version précédente
2 test de chaque item de ce tableau sur la présence de "tel" ou "cel" : le résultat de ce test vas rendre une variable booléenne true ou false
je l'ai appellé "cond1"
3 en cas de non présence des 2 indices "tel" et "cel" :: test sur l'item de sa longueur de chaine (il nous faut 8) et de sa valeur numérique ou pas
le résultat de ce test va rendre une 2eme variable booléenne a true ou false
je l'ai appelé "cond2"
4 test des 2 variables booléenne (cond1/cond2)
si l'une ou l'autre est a "true " alors c'est bon c'est un numéro de téléphone
5 sic'est un numéro de téléphone alors on modifie l'item avec un petit nettoyage par des multiple replace et en prime formatage du numéro
6 a la fin il se peut que la boucle ai trouvé 2 numéros de tel sur la ligne :que cela te tienne formatage intelligible des 2 numéro dans l'item du tableau
7 au final on pause la variable tableau dans la colonne" D" avec des jolis numéros formatés
ET LE TOUT EN 9 LIGNES SI ON SUPPRIME LES COMMENTAIRES !!!
j'ai encore bien bossé moi je vais prendre un café ;)
colle ca dans un module standard du dernier fichier que tu m'a envoyé
si tu me dis que ca marche pas met toi a la couture :mouarf:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Sub test2() tabloA = Range("c2:c" & Range("c" & Rows.Count).End(xlUp).Row) For i = 1 To UBound(tabloA) - 1 'condition n°1 presence de tel ou cel cond1 = IIf(LCase(tabloA(i, 1)) Like "tel*" = True Or LCase(tabloA(i, 1)) Like "cel*" = True, True, False) 'condition n° 2 :8 caracteres au total et tous numerique 'si c'est le cas il peut y avoir des "." des "-" des " " cond2 = IIf(IsNumeric(tabloA(i, 1)) = True And Len(Replace(Replace(Replace(tabloA(i, 1), ".", ""), "-", ""), " ", "")) = 8, True, False) ' rassemblement des conditions dans une autre variable bolean condfinale = IIf(cond1 = True Or cond2 = True, True, False) 'modification ou desinscription de l'item selon la variable condfinale tabloA(i, 1) = Format(IIf(condfinale = True, Replace(Replace(Replace(Replace(Replace(Replace(LCase(tabloA(i, 1)), "tel", ""), "cel", ""), ":", ""), ".", ""), "-", ""), "l", ""), ""), "00 00 00 00") '1 derniere verificatio au cas ou il y aurait 2 numero de tel dans la ligne tabloA(i, 1) = IIf(tabloA(i, 1) Like "* / *" = True, Format(Left(tabloA(i, 1), 8), "00 00 00 00") & " / " & Format(Right(tabloA(i, 1), 8), "00 00 00 00"), Format(tabloA(i, 1), "00 00 00 00")) Next Cells(2, 4).Resize(UBound(tabloA), 1) = tabloA ' comme tu peut le constater dans le resultat je me suis meme permis de formater le numero et le tout en 9 ligne End Sub
voila une autre solution qui te donnera a mon avis satisfaction
si on considère les critères
1 présence de tel ou cel tout seul
2 présence de tel ou cel dans du texte
3 numéro tout seul 8 caractères ou plus
voila un code de 10 lignes qui nous donne un résultat de 100%
j'ai utiliser dans ce code la fonction "Replace","instr" "split","like"
et je viens de trouver encore plus simple je suis en train de fignolerCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub test4() tabloA = Range("c2:c" & Range("c" & Rows.Count).End(xlUp).Row) For i = 1 To UBound(tabloA) - 1 'on supprime tout les caractères spéciaux non souhaités dans la chaine de la valeur de la cellule et on remplace "cel" par "tel" tabloA(i, 1) = Replace(Replace(Replace(Replace(Replace(Replace(Replace(LCase(tabloA(i, 1)), ".", ""), "-", ""), " ", ""), ":", ""), "cel", "tel"), "ll", "l"), "/", "") 'on teste maintenant la présence de "tel" si cest oui alors on garde la partie après "tel If InStr(tabloA(i, 1), "tel") > 0 Then tabloA(i, 1) = Split(tabloA(i, 1), "tel")(1) ' on teste maintenant les 8 1er caractères si c'est numérique on garde puisque c'est donc un tel ou peut être 2 numéros de tel tabloA(i, 1) = IIf(IsNumeric(Left(tabloA(i, 1), 8)) = True, tabloA(i, 1), "") 'il se peut que même en ayant 8 caractère numérique et plus ca ne corresponde pas a un numéro de tel alors un petit control avec la fonction like sur les lettres de l'alphabet complet décidera si c'est oui ou non If tabloA(i, 1) Like "*[a-z]*" = True Then tabloA(i, 1) = "" 'on teste maintenant la longueur entière du numéro tel si c'est 8 caractères alors le format c'est "00 00 00 00" ' si c'est plus que 8 chiffre alors le format c'est "00 00 00 00" et "tel2: " et "00 00 00 00" tabloA(i, 1) = IIf(Len(tabloA(i, 1)) < 9, Format(Left(tabloA(i, 1), 8), "00 00 00 00"), Format(Left(tabloA(i, 1), 8), "00 00 00 00") & "/" & Format(Right(tabloA(i, 1), 8), "00 00 00 00")) tabloA(i, 1) = Replace(IIf(tabloA(i, 1) Like "/", "", tabloA(i, 1)), "/", " Tel 2 : ") Next 'on repose le tableau en colonne "D" Cells(2, 4).Resize(UBound(tabloA), 1) = tabloA End Sub
re
salut
histoire de te rendre encore plus dingue
j'ai fait cette sub encore plus courte
cette version a une option en plus :maintenant si un numéro de téléphone se trouve entre 2 morceaux de chaine de caractères il est trouvé quand même
en fait la chose était très simple depuis le début
donc dans cette version on est aller a l'essentiel dans la logique
1° si il y a tel ou cel alors il y a un numéro :sil il y a un numéro et si le reste du texte après "tel " est numérique alors c'est un ou plusieurs numéros
si ca n'est pas numérique ca veut dire que le numéro est entre 2 morceaux de chaine donc on prendra les 8 caractères après "tel"
et tout ca sur la même ligne
2° ensuite on teste la cellule avec like sur les caractères de tout l'alphabet si c'est oui pas de numéro si c'est non c'est un numéro ou plusieurs
et enfin
3° teste de la longueur si c'est 16 caractères c'est 2 numéros si c'est 8 c'est 1 numéro
et tout ca aussi sur une seule ligne de code
et voila quand on raisonne logiquement ca devient tout de suite plus simple
et voila comment en 4 ligne on tri tout foutra de données mélimélo
bien que la 4 eme ligne apres "formatage" est facultative ca c'est le bonus en vérité seule les 3 1eres lignes suffisent pour le travail que tu a demandé
les aspro c'est pas remboursé par la sécu désolé :ptdr::mouarf:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Sub test5() tablo = Range("c2:c" & Range("c" & Rows.Count).End(xlUp).Row) For i = 1 To UBound(tablo) - 1 'on supprime tout les caracteres speciaux non souhaités dans la chaine de la valeur de la cellule et on remplace "cel" par "tel" tablo(i, 1) = Replace(Replace(Replace(Replace(Replace(Replace(Replace(LCase(tablo(i, 1)), ".", ""), "-", ""), " ", ""), ":", ""), "cel", "tel"), "ll", "l"), "/", "") If InStr(tablo(i, 1), "tel") > 0 Then tablo(i, 1) = IIf(IsNumeric(Split(tablo(i, 1), "tel")(1)), Split(tablo(i, 1), "tel")(1), Left(Split(tablo(i, 1), "tel")(1), 8)) If tablo(i, 1) Like "*[a-z]*" = True Then tablo(i, 1) = "" 'formatage tablo(i, 1) = IIf(Len(tablo(i, 1)) = 16, Format(tablo(i, 1), "00 00 00 00 -- 00 00 00 00"), Format(tablo(i, 1), "00 00 00 00")) Next 'on repause le tableau en colonne "D" Cells(2, 4).Resize(UBound(tablo), 1) = tablo End Sub
Salut,
@patricktoulon
Le résultat est Super.
je suis d'autant plus impressionné par l'intérêt avec lequel vous avez
résolu mon problème. Merci
Merci à tous.