Extraire texte depuis cellule excel se trouvant entre caract.

MSijij7929200

XLDnaute Nouveau
Bonjour,
je me casse la tête à trouver une formule (en anglais ce serait top!;) pour extraire une partie de texte depuis une cellule.

Je ne peux pas utiliser GAUCHE ou DROITE car mes BDD varient à souhait, ni les CHERCHE, je ne peux pas compter à parti d'un certain nombre de caractères et surtout la chaine s'arrête après d'autres caractères.

Un exemple sera plus concret:
RT CHFR 3-30j Produits [**:Tucroisquecamarche][sg:TG][ca:RC][st:blablabli][dv:uiouinon][la:FR][pa:CH][ob:camarcheencore]

Je voudrais extraire de ceci "Tucroisquecamarche" dans une autre cellule, puis "blablabli" dans une autre cellule puis "camarcheencore" dans une autre cellule etc...

Merciiiii d'avance pour votre si précieuse aide!
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir Efgé, heureux de te croiser,

Si l'on veut toujours extraire les 1er, 4ème, 8ème textes entre crochets :
Code:
Function Extract$(t$, n%)
Dim critere, i%, j%
critere = Array(1, 4, 8) 'liste des critères, à adapter
For i = 1 To Len(t)
  If Mid(t, i, 1) = "[" Then j = j + 1
  If j = critere(n - 1) Then
    If Mid(t, i + 1, 1) = "]" Then Exit Function
    For j = i + 2 To Len(t)
      If Mid(t, j, 1) = "]" Then Exit For
    Next
    t = Mid(t, i + 1, j - i - 1)
    j = InStr(t, ":")
    Extract = Trim(Mid(t, j + 1))
    Exit Function
  End If
Next
End Function
Cette fonction doit être placée dans un module standard pour pouvoir être utilisée dans la feuille.

Fichier joint.

A+
 

Pièces jointes

  • Extract(1).xlsm
    21.2 KB · Affichages: 32

job75

XLDnaute Barbatruc
Re,

Avec les critères choisis dans des listes de validation en B1 C1 D1 c'est plus simple :
Code:
Function Extract$(t$, critere%)
If critere = 0 Then Exit Function
Dim i%, j%
For i = 1 To Len(t)
  If Mid(t, i, 1) = "[" Then j = j + 1
  If j = critere Then
    If Mid(t, i + 1, 1) = "]" Then Exit Function
    For j = i + 2 To Len(t)
      If Mid(t, j, 1) = "]" Then Exit For
    Next
    t = Mid(t, i + 1, j - i - 1)
    j = InStr(t, ":")
    Extract = Trim(Mid(t, j + 1))
    Exit Function
  End If
Next
End Function
Fichier (2).

A+
 

Pièces jointes

  • Extract(2).xlsm
    21.2 KB · Affichages: 41
Dernière édition:

MSijij7929200

XLDnaute Nouveau
Hello

J ai pris celui de Efgé car plus accessible pour moi;) je vais transformer tout ceci en pivot table et je souhaite savoir si la colone B2 [**: peut être renommée pour que cela fasse plus sens lors de la construction du pivot table. par exemple [**: signifie "achat", comment puis je le renommer en conservant la même formule? merci encore!
 

job75

XLDnaute Barbatruc
Bonjour Fred,

Les ;1 dans chacun des 2 TROUVE sont inutiles, en les supprimant on gagne 6 octets en mémoire.

En remplaçant NBCAR($A2) par 32767 on gagne encore 5 octets.

Au total cette formule fait donc gagner 11 octets :
Code:
=SIERREUR(STXT($A2;TROUVE("@";SUBSTITUE($A2;"[";"@";COLONNES($A:A)))+4;TROUVE("]";STXT($A2;TROUVE("@";SUBSTITUE($A2;"[";"@";COLONNES($A:A)))+4;32767))-1);"")
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 201
Messages
2 086 168
Membres
103 151
dernier inscrit
nassim