Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Extraire un groupe de caractères vers une seule cellule, selon condition

Nougatine95

XLDnaute Occasionnel
Bonsoir Le Forum,

Après avoir ouvert des dizaines de posts afin d'y trouver une équivalence à ma recherche, je capitule.

Ma requête:
Extraire un groupe de caractères (caractères issus d'une chaîne de texte), vers une seule cellule, selon condition.

Petit fichier joint.
Il n'y a pas d'urgence!

En vous remerciant.
 

Pièces jointes

  • Extraire un groupe de caractères vers une seule cellule, selon condition.xlsx
    12.2 KB · Affichages: 68
  • Extraire un groupe de caractères vers une seule cellule, selon condition.xlsx
    12.2 KB · Affichages: 71
  • Extraire un groupe de caractères vers une seule cellule, selon condition.xlsx
    12.2 KB · Affichages: 70

david84

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir,
une fonction personnalisée brute de décoffrage à tester :
Code:
Function RegrouperCar(c As String, Rang As Integer) As String
Dim s As Variant, i As Long, res As String, Nb As Integer
c = Replace(Replace(c, "[", "/"), "]", "/")
s = Split(c, "/")
For i = 1 To Len(s(0))
  res = res & Mid(s(0), i, 1) & " ": Nb = Nb + 1
Next i
s(0) = Left(res, Len(res) - 1): res = vbNullString
For i = 1 To Len(s(2))
  res = res & Mid(s(2), i, 1) & " ": Nb = Nb + 1
Next i
s(2) = Left(res, Len(res) - 1)
s = Split(Join(s))
If Rang - 1 <= Nb Then RegrouperCar = s(Rang - 1)
End Function

Pour l'utiliser :
Code:
=RegrouperCar($A3;COLONNES($A:A))
à tirer vers la droite et le bas.
A+
 

R@chid

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir @ tous,
Une variante par formule..
Voir PJ

@ + +
 

Pièces jointes

  • Nougatine95.xlsx
    13.4 KB · Affichages: 77

Nougatine95

XLDnaute Occasionnel
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour Le Forum,

Merci R@chid,

Je viens de voir la formule, c'est parfait.
Pour VBA, je teste dans la journée.

Tu es foor-mi-dable! Tous formidables!

Bonne journée.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour à tous,

Avec les 4 noms définis Mot N X Y la formule en B21 est bien simple :

Code:
=REPT(STXT($A21;N;1);N<X)&REPT(Mot;N=X)&REPT(STXT($A21;N+NBCAR(Mot)+1;1);N>X)
A tirer à droite et vers le bas.

Fichier joint.

A+
 

Pièces jointes

  • Extraire un groupe de caractères vers une seule cellule, selon condition(1).xls
    44 KB · Affichages: 51
  • Extraire un groupe de caractères vers une seule cellule, selon condition(1).xls
    44 KB · Affichages: 53
  • Extraire un groupe de caractères vers une seule cellule, selon condition(1).xls
    44 KB · Affichages: 49

Nougatine95

XLDnaute Occasionnel
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour Le Forum,

david84, R@chid, job75

Le code VBA fonctionne, les formules également.

Merci beaucoup les amis.

Lorsque j'ajoute des données sur cellule A3 par exemple,
PAAPP[SUOUR]MPTG --> PAAPP[SUOUR]MPTG[OPR]A

en effet il peut y avoir des cas où: plusieurs [] dans colonne A, de ce fait code et formules n'effectuent pas leur tâche jusqu'au bout.

Le code (david84) ne renvoie pas de cellule supplémentaire
Le résultat reste:
P A A P P SUOUR M P T G

Code :
Function RegrouperCar(c As String, Rang As Integer) As String
Dim s As Variant, i As Long, res As String, Nb As Integer
c = Replace(Replace(c, "[", "/"), "]", "/")
s = Split(c, "/")
For i = 1 To Len(s(0))
res = res & Mid(s(0), i, 1) & " ": Nb = Nb + 1
Next i
s(0) = Left(res, Len(res) - 1): res = vbNullString
For i = 1 To Len(s(2))
res = res & Mid(s(2), i, 1) & " ": Nb = Nb + 1
Next i
s(2) = Left(res, Len(res) - 1)
s = Split(Join(s))
If Rang - 1 <= Nb Then RegrouperCar = s(Rang - 1)
End Function

Pour l'utiliser :
Code :
=RegrouperCar($A3;COLONNES($A:A))
à tirer vers la droite et le bas.

***
Cette formule (R@chid):
=SI(COLONNES($B:B)<TROUVE("[";$A25);STXT($A25;COLONNES($B:B);1);SI(COLONNES($B:B)=TROUVE("[";$A25);STXT($A25;TROUVE("[";$A25)+1;TROUVE("]";$A25)-TROUVE("[";$A25)-1);STXT($A25;TROUVE("]";$A25)-TROUVE("[";$A25)+COLONNES($B:B);1)))

Et cette autre formule (job75):
=REPT(STXT($A21;N;1);N<X)&REPT(Mot;N=X)&REPT(STXT($A21;N+NBCAR(Mot)+1;1);N>X)

donnent:
P A A P P SUOUR M P T G [ O P R ] A

L'un d'entre vous peut-il intervenir?

Je vous en remercie.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour, Rachid, Gérard,

Lorsque j'ajoute des données sur cellule A3 par exemple,
PAAPP[SUOUR]MPTG --> PAAPP[SUOUR]MPTG[OPR]A

en effet il peut y avoir des cas où: plusieurs [] dans colonne A, de ce fait code et formules n'effectuent pas leur tâche jusqu'au bout.
J'en conclus que les 2 exemples présentés dans ton fichier ne sont pas explicites...à tester et à vérifier de ton côté :
Code:
Function RegrouperCar(c As String, Rang As Integer) As String
Dim s As Variant, i As Integer, j As Integer, res As String, Nb As Integer
If c = vbNullString Then Exit Function
c = Replace(Replace(c, "[", "/|"), "]", "|/")
s = Split(c, "/")
For i = LBound(s) To UBound(s)
  If s(i) Like "|*|" Then
    s(i) = Replace(s(i), "|", ""): res = res & s(i) & " ": Nb = Nb + 1
  Else
    For j = 1 To Len(s(i))
      res = res & Mid(s(i), j, 1) & " ": Nb = Nb + 1
    Next j
  End If
Next i
res = Left(res, Len(res) - 1)
s = Split(res)
If Rang - 1 < Nb Then RegrouperCar = s(Rang - 1)
End Function
A+
 

Nougatine95

XLDnaute Occasionnel
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour, Rachid, Gérard,


J'en conclus que les 2 exemples présentés dans ton fichier ne sont pas explicites...

En effet david84, R@chid, job75, j'ai mal développé.

Je viens de copier et remplacer par ce code,
le résultat reste identique

PAAPP[SUOUR]MPTG[OPR]A
renvoie
P A A P P SUOUR M P T G
 

david84

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

En effet david84, R@chid, job75, j'ai mal développé.

Je viens de copier et remplacer par ce code,
le résultat reste identique

PAAPP[SUOUR]MPTG[OPR]A
renvoie
P A A P P SUOUR M P T G

Chez moi
PAAPP[SUOUR]MPTG[OPR]A
renvoie
P A A P P SUOUR M P T G OPR A
C'est bien le résultat attendu, non ?
A+
 

job75

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Re,

Une fonction VBA différente de celle de David :

Code:
Function Crochets(t$, ordre%)
Dim i%, x$, grp As Boolean, n%
For i = 1 To Len(t)
  x = Mid(t, i, 1)
  If Not grp And x <> "[" Then
     Crochets = x
     n = n + 1
  ElseIf x <> "]" Then
    grp = True
    Crochets = Crochets & x
  Else
    grp = False
    n = n + 1
    Crochets = Mid(Crochets, 3 + (Left(Crochets, 1) = "["))
  End If
  If n = ordre Then Exit Function
Next
Crochets = ""
End Function
Je crains qu'elle ne soit moins rapide, il faudrait tester la durée d'exécution.

Fichier (2).

A+
 

Pièces jointes

  • Extraire un groupe de caractères vers une seule cellule, selon condition(2).xls
    56 KB · Affichages: 51
  • Extraire un groupe de caractères vers une seule cellule, selon condition(2).xls
    56 KB · Affichages: 49
  • Extraire un groupe de caractères vers une seule cellule, selon condition(2).xls
    56 KB · Affichages: 49
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir à tous , job75


david84
Tu as bien un petit pattern de derrière les fagots pour ce genre de question, non ?
Parce que moi mon RegExp est un peu rouillé et JNP se fait de plus en plus rare
 

Nougatine95

XLDnaute Occasionnel
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir Le Forum,
R@chid, job75, david74, Staple1600

Merci job75, david74 pour vos propositions de codes.
Après avoir re puis re-tester ton code david74, le copier-coller me renvoie 1 fois sur 2, des infos en rouge (dans le code), je verrai cela demain.

job75, test OK sur fichier récupéré sur site; mais toujours ce problème de code en rouge lorsque je fais à l'identique dans mon fichier.
Suis loin d'être au top côté VBA, ça commence à me prendre la tête.

Merci pour votre dévouement.
@ demain.

Bonne soirée.
 

david84

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir à tous , job75


david84
Tu as bien un petit pattern de derrière les fagots pour ce genre de question, non ?
Parce que moi mon RegExp est un peu rouillé et JNP se fait de plus en plus rare
Bon alors juste pour te faire plaisir :
Code:
Function RegrouperCar(c As String, Rang As Integer) As String
Dim Reg As Object, Matches As Object
If c = vbNullString Then Exit Function
Set Reg = CreateObject("vbscript.regexp")
With Reg
  .Global = True
  .IgnoreCase = True
  .Pattern = "([A-Z]|[[A-Z]+])"
  If .test(c) = True Then Set Matches = .Execute(c)
End With
If Rang - 1 < Matches.Count Then RegrouperCar = Replace(Replace(Matches(Rang - 1), "[", ""), "]", "")
End Function
Si les chaînes de caractères comportent autre chose que des caractères alphabétiques il faudra modifier le pattern en conséquence.
A+
 

job75

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Re,

Ma crainte n'était pas fondée

Sur Win Xp - Excel 2003 j'ai testé mon fichier (2) sur 20000 lignes avec cette macro :

Code:
Sub Test()
Dim t
t = Timer
[A21:Q24].Copy [A25:Q20020]
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
Avec la fonction de David84 => 18,88 secondes

Avec la fonction de job75 => 10,11 seconde.

A+
 

job75

XLDnaute Barbatruc
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Re,

Avec la macro de David du post #13 => 9 minutes 19 secondes

Cela confirme que regexp est fort peu brillant en terme de durée d'exécution.

A+
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…