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

  • Initiateur de la discussion Initiateur de la discussion DukeDevlin
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

Bonsoir à tous,

Avec une fonction personnalisée dans module1.
Recopier les formules de D2 et E2 vers le bas.

Le fonction NcaNcr prend deux arguments:
  • le premier est le texte à analyser
  • le second est le nombre de chiffres des nombres à extraire ( 4 pour NCA et 5 pour NCR)
Le code de la fonction (dans module1):
VB:
Function NcaNcr(x As String, q As Integer)
Dim s$, t, i&, r$

s = Replace(Replace(LCase(x), "ncr", " "), "nca", " ")
s = Replace(s, "&", " ")
s = Replace(s, """", " ")
s = Replace(s, "'", " ")
s = Replace(s, "{", " ")
s = Replace(s, "(", " ")
s = Replace(s, "[", " ")
s = Replace(s, "-", " ")
s = Replace(s, "|", " ")
s = Replace(s, "`", " ")
s = Replace(s, "_", " ")
s = Replace(s, "\", " ")
s = Replace(s, "^", " ")
s = Replace(s, ")", " ")
s = Replace(s, "@", " ")
s = Replace(s, ")", " ")
s = Replace(s, "]", " ")
s = Replace(s, "°", " ")
s = Replace(s, "+", " ")
s = Replace(s, "=", " ")
s = Replace(s, "}", " ")
s = Replace(s, "/", " ")
s = Replace(s, ",", " ")
s = Replace(s, "?", " ")
s = Replace(s, ".", " ")
s = Replace(s, ";", " ")
s = Replace(s, ":", " ")
s = Replace(s, "/", " ")
s = Replace(s, "!", " ")
s = Replace(s, "-", " ")
s = Application.Trim(s)
t = Split(s)
For i = 0 To UBound(t)
   If Not IsNumeric(t(i)) Then Exit For
   If Len(t(i)) = q Then r = LTrim(r & " " & t(i))
Next i
NcaNcr = Replace(r, " ", " / ")
End Function

edit: la liste des séparateurs à ignorer est sans doute trop longue. Vous pouvez aisément en supprimer (judicieusement).
 

Pièces jointes

Dernière édition:
Enfin (il n'est jamais trop tard pour bien faire) .
La solution passe par une fonction personnalisée, à mettre dans un module standard :
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
Et à utiliser ainsi :
en B1 : formule (à tirer ensuite vers le bas) :
Code:
=extrait(A1;5)
et en C1 : formule (à tirer ensuite vers le bas) :
Code:
=extrait(A1;4)

et sans REGEX (natif sur les PC mais inhibé sur certains, dont le mien 🙂 )

Merci ! Je n'ai pas le bon ordinateur et le fichier sur moi, je teste Lundi pour voir si cela fonctionne. Donc ça passe par du VBA et ensuite attribuer la formule à la cellule, c'est bien ça ? Merci.
 
Bonsoir à tous,

Avec une fonction personnalisée dans module1.
Recopier les formules de D2 et E2 vers le bas.

Le fonction NcaNcr prend deux arguments:
  • le premier est le texte à analyser
  • le second est le nombre de chiffres des nombres à extraire ( 4 pour NCA et 5 pour NCR)
Le code de la fonction (dans module1):
VB:
Function NcaNcr(x As String, q As Integer)
Dim s$, t, i&, r$

s = Replace(Replace(LCase(x), "ncr", " "), "nca", " ")
s = Replace(s, "&", " ")
s = Replace(s, """", " ")
s = Replace(s, "'", " ")
s = Replace(s, "{", " ")
s = Replace(s, "(", " ")
s = Replace(s, "[", " ")
s = Replace(s, "-", " ")
s = Replace(s, "|", " ")
s = Replace(s, "`", " ")
s = Replace(s, "_", " ")
s = Replace(s, "\", " ")
s = Replace(s, "^", " ")
s = Replace(s, ")", " ")
s = Replace(s, "@", " ")
s = Replace(s, ")", " ")
s = Replace(s, "]", " ")
s = Replace(s, "°", " ")
s = Replace(s, "+", " ")
s = Replace(s, "=", " ")
s = Replace(s, "}", " ")
s = Replace(s, "/", " ")
s = Replace(s, ",", " ")
s = Replace(s, "?", " ")
s = Replace(s, ".", " ")
s = Replace(s, ";", " ")
s = Replace(s, ":", " ")
s = Replace(s, "/", " ")
s = Replace(s, "!", " ")
s = Replace(s, "-", " ")
s = Application.Trim(s)
t = Split(s)
For i = 0 To UBound(t)
   If Not IsNumeric(t(i)) Then Exit For
   If Len(t(i)) = q Then r = LTrim(r & " " & t(i))
Next i
NcaNcr = Replace(r, " ", " / ")
End Function

Cela semble fonctionner aussi, mais est-ce que cela fonctionne qu'aux exemples données où je couvre toutes les situations possibles et inimaginables ? Merci à toi, je teste Lundi avec le bon ordi et le vrai fichier !
 
où je couvre toutes les situations possibles et inimaginables ?
En informatique j'ai appris que c'était impossible. Plus l'utilisateur est novice en informatique, plus il découvre (à l'insu de son plein gré) des situations, des coïncidences, des cas particuliers tout à fait insoupçonnables pour l’informaticien et qui font planter le système. C'est comme ça.
 
Dernière édition:
En informatique j'ai appris que c'était impossible. Plus l'utilisateur est novice en informatique, plus il découvre (à l'insu de son plein des gré) des situations, des coïncidences, des cas particuliers tout à fait insoupçonnables pour l’informaticien et qui font planter le système. C'est comme ça.
Je testerai en tout cas sur mes 4000 lignes. Mais est-ce que ça couvre les sujets qui ont deux NCA et/ou deux NCR ? Ou ça s’arrête à la première chaîne de 4 ou 5 chiffres ? Merci.
 
re
tant pis pour les machin 😉


VB:
Function les_4_ou_5_faut_savoir(var As String, longueur As Long)
    Dim t, x$
    With CreateObject("VBScript.RegExp"):
        .Global = True: .IgnoreCase = True
        .Pattern = "[A-z]": var = " " & .Replace(var, " ")    'suppression des[26]de  l'alphabet
        .Pattern = "[\.|\/|;|:|,|!|\\|'|é|è|à|û|ü|ê|ë]|[^\w]": var = " " & .Replace(var, " ")    'supression des caracteres particuliers
        var = Application.Trim(var)    'app.trim (1 seul espace comme separateur)
        t = Split(var, " ")
        For i = 0 To UBound(t): x = x & IIf(Len(t(i)) = longueur, t(i) & " ", ""): Next
    End With
    les_4_ou_5_faut_savoir = Trim(x)
End Function

formule=
pour les series 4
=les_4_ou_5_faut_savoir(B4;4)

pour series 5
=les_4_ou_5_faut_savoir(B4;5)

démo
demo3.gif
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour