Isoler une partie de texte d'une cellule avec position variable ?

DukeDevlin

XLDnaute Nouveau
Bonjour,

Je viens vers vous aujourd'hui pour avoir vos lumières. En effet, vous trouverez en PJ un tableau expliquant mon problème. J'ai une cellule contenant un descriptif assez long. Et j'aimerais isoler 2 références à partir de ce descriptif : Le NCA et le NCR. Je sais que le NCA a 4 chiffres et le NCR 5 chiffres et que l'un comme l'autre peuvent être placés qu'au début (à gauche) et non pas à la fin. Le problème, c'est que la nomenclature utilisée peut changer d'une cellule à une autre comme joint dans l'exemple, sinon cela serait trop facile et il suffirait d'utiliser la fonction GAUCHE. Avez-vous une idée pour que je clean le fichier en faisant ressortir les NCA et NCR pour chaque descriptif dans deux nouvelles colonnes ? Je pense que cela sera plus parlant avec l'exemple.

Merci à vous. Bonne journée.
 

Pièces jointes

  • Test.xlsx
    9.2 KB · Affichages: 27

patricktoulon

XLDnaute Barbatruc
re
ooouuuaaaaiiiiisss! vbs et alors!!!? ;)
j'en remet un coup du scrun tient rien que pour faire plaisir a jmfmarques ;););)
demo3.gif


houuuuuh!!houhhh! c'est moi scrunchitator ;):D:D:D:D
bon c'est l'heure du café arrosé a tout de suite
 

patricktoulon

XLDnaute Barbatruc
re
mmmhhhmm mouuuais.........
Capture.JPG

ben qu'il choisisse bien alors ;)
1 juste
2 faux
3 faux il c'est perdu celui là
4 faux
5 faux il c'est perdu celui là
etc...etc....

j'ai utilisé ta fonction
VB:
Public Function extrait(ch As String, n As Integer) As String
  Dim k As Long, flt As String, titi
  flt = String(n, "#")
  titi = Split(StrConv(ch, vbUnicode), Chr(0))
  For i = 0 To UBound(titi) - 1
   If Not IsNumeric(titi(i)) Then titi(i) = Chr(1)
  Next
  titi = Split(Join(titi, ""), Chr(1))
  For k = 1 To UBound(titi)
    If titi(k) Like flt Then
      extrait = extrait & "-" & titi(k)
    End If
  Next
  extrait = Mid(extrait, 2)
End Function

je rapelle ce que souhaite le demandeur
Capture.JPG
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
allez j'enfonce le clou
maintenant que le raisonnement avec regex se vérifie et bien on fait sans
VB:
Function les_nombres(cel As String, nombre)
Dim i&, T, x$
For i = 1 To Len(cel):  Mid(cel, i, 1) = IIf(Not IsNumeric(Mid(cel, i, 1)), " ", Mid(cel, i, 1)): Next
 cel = Application.Trim(cel)
T = Split(cel, " ")
For i = 0 To UBound(T): x = x & IIf(Len(T(i)) = nombre, T(i) & " ", ""): Next
les_nombres = IIf(x = 0, "", x)
End Function

comme avec le regex (même raisonnement!!! )
  1. on remplace tout ce qui n'est pas numérique par un espace
  2. on régularise les doubles(triple) espace avec application.trim
  3. on coupe le résultat par les espaces qui reste
  4. on garde que les len (argument(nombre))
ça plaira peut être plus à jmfmarques

salutations de scrunchitator du fin fond du regextant ;) :D
ok je sort :oops:
 

Staple1600

XLDnaute Barbatruc
Re

Peu importe le lecteur expérimenté ou pas en VBA
Le principal, c'est qu'il soit un lecteur curieux
(qui donc aurait été voir dans l'aide en ligne de VBA que l'espace est le séparateur par défaut de Split)

PS: Et ton argument est un chouia "fallacieux" ;)
Car pour un lecteur inexpérimenté, tu aurais du écrire pour commencer
Dim i As Long, T As Variant, x As String
et non pas
Dim i&, T, x$
;)
 

patricktoulon

XLDnaute Barbatruc
jmfmarques
a la limite, je viens de revoir tout le post ,mapomme tient un peu le même raisonnement avec son long replace
dans mon raisonnement je suis plus dur
je shunte sans distinction tout sauf les [0-9]
régule avec app.trim , split , garde les bons
terminé
après pour être honnête, je sais pas si vu les chaines le regex va pas plus vite ou non dans la partie replace
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 088
Membres
103 461
dernier inscrit
dams94