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

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 !

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

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

Re,

Oui c'est mieux mais chez toi comme chez moi ça ne fait qu'une différence de 4%.

Mais c'est vrai qu'à force de pinailler on est passé de 2,38 s à 2,16 s soit quand même un delta de 9%.

A+
 
Dernière édition:
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour, Le Forum, Le Fil,

Eh bien! j'ai du travail et tester tout cela dans la journée.

Un grand merci pour votre aide toujours si précieuse.

Bonne journée,
@ bientôt,
Noug
 
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour le fil, le forum,

Si l'on accepte que dans le tableau des résultats les cellules non renseignées contiennent #N/A cette macro est plus rapide :

Code:
Function Crochets(t$)
Dim s$, i%, x$, j%, y$
s = Chr(1) 'séparateur
For i = 1 To Len(t)
  x = Mid(t, i, 1)
  If x = "[" Then
    j = InStr(i, t, "]")
    x = Mid(t, i + 1, j - i - 1)
    i = j
  End If
  y = y & s & x
Next
Crochets = Split(Mid(y, 2), s)
End Function
Durée d'exécution 1,84 seconde (Win XP - Excel 2003).

Fichier (6) avec les #N/A visibles, fichier (6 bis) avec les #N/A masqués par MFC.

A+
 

Pièces jointes

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

Bonsoir, Le Forum, Le Fil,
job75, david84, mapomme, Staple1600, R@chid,

Je vous remercie tou(te)s pour vos interventions.

Un très grand choix de propositions, toutes aussi satisfaisantes les unes que les autres.

Je vous envie pour vos connaissances intarissables en VBA.
Je travaille sur ce sujet en solo, pour n'atteindre actuellement qu'un vraiment tout petit niveau.

Bonne soirée.

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

Bonjour Le Forum, Le Fil,

Je revois chacune de vos propositions, pour tests et retests, depuis 2 jours sauf que...
mon excel bug!

Lorsque je mets en route ma turbine excel, cela tourne en boucle, etc, excel se ferme pour certains fichiers!

Revenons vers le sujet:
Au maximum 500 lignes et 200 colonnes, maxi 5 feuilles.

Mes préférences vont vers:

- le code de job75 (#2)
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.

qui ne s'adapte plus lorsque les chaînes sont du style:
APPRTYDGH[UHT]RP[AZ][RTT]NA
parce que je n'avais pas précisé que plusieurs []...

- le code de job75 (#10)
soit une macro sans formule matricielle associée
qui ne renvoie pas:
MRS[SOUR]MGPMT[PRO]A[OHE][HH]JL M R S SOUR M G P M T PRO A OHE HH J L

mais:
MRS[SOUR]MGPMT[PRO]A[OHE][HH]JL M R S SOUR M G P M T PRO A OHE E[HH J L


Cordialement.
 

Pièces jointes

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

Re,

Maintenant si vous tenez absolument à utiliser la macro du post #10 il faut en effet la modifier en utilisant la variable y :

Code:
Function Crochets(t$, ordre%)
Dim i%, x$, grp As Boolean, n%, y$
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
    y = y & x
  Else
    grp = False
    n = n + 1
    Crochets = Mid(y, 2)
    y = ""
  End If
  If n = ordre Then Exit Function
Next
Crochets = ""
End Function
Fichier joint.

A+
 

Pièces jointes

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

Re,

Et si vous avez bien suivi le fil, vous avez dû remarquer que David84 a introduit la fonction InStr, plus performante.

Donc la macro du post #10 modifiée dans ce fichier (2) :

Code:
Function Crochets$(t$, ordre%)
Dim i%, x$, j%, n%
For i = 1 To Len(t)
  x = Mid(t, i, 1)
  If x <> "[" Then
     Crochets = x
  Else
    j = InStr(i, t, "]")
    Crochets = Mid(t, i + 1, j - i - 1)
    i = j
  End If
  n = n + 1
  If n = ordre Then Exit Function
Next
Crochets = ""
End Function
A+
 

Pièces jointes

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

Bonjour job75

Bonjour Nougatine95,

Mais pourquoi la macro du post #10 😕 utilisez la forme matricielle du post #30.

Elle est beaucoup plus rapide.

Fichier joint.

A+

Pas de forme matricielle, parce que je ne serai pas seule à utiliser ce fichier, des lignes, des pages ajoutées, etc,
c'est moins évident à gérer, même si + rapide pour post #30.

Toutefois j'y réfléchis et soumettrai.

J'ai pu ouvrir ce dernier fichier joint (ouf), c'est excellent pour résultat attendu.

Merci beaucoup job75.
 
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Re,

Quant aux problèmes de plantage que vous signalez, ils doivent provenir du recalcul des feuilles.

N'auriez-vous pas des fonctions volatiles comme MAINTENANT DECALER ou INDIRECT ?

Il faudrait nous montrer votre fichier allégé (2 ou 3 lignes pour chaque tableau suffisent).

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

Bonjour Nougatine95, le forum,

A la réflexion je pense que le plantage provient du 2ème argument de la fonction avec COLONNES.

En colonne S par exemple, chaque fois qu'une cellule se recalcule COLONNES($B:S) entraîne le recalcul de tout le tableau B:S.

Avec la fonction COLONNE() il ne devrait plus y avoir de problème :

Code:
=Crochets($A11;COLONNE()-1)
Le -1 parce que l'on commence en colonne B, -2 si l'on commence en colonne C...

Fichier (3).

Edit : pour déterminer la durée du recalcul de votre fichier exécutez la macro :

Code:
Sub Durée()
Dim t
t = Timer
[A:A].Copy [A1]
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
A+
 

Pièces jointes

Dernière édition:
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

A la réflexion je pense que le plantage provient du 2ème argument de la fonction avec COLONNES
.................................
Avec la fonction COLONNE() il ne devrait plus y avoir de problème :

Code :
=Crochets($A11;COLONNE()-1)
Le -1 parce que l'on commence en colonne B, -2 si l'on commence en colonne C...
Si c'est le cas on peut également utiliser COLONNE(A:A) plutôt que COLONNE()-1 pour éviter au besoin de rectifier le -1 ou le -2.
A+
 
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonjour David,

Si c'est le cas on peut également utiliser COLONNE(A:A) plutôt que COLONNE()-1 pour éviter au besoin de rectifier le -1 ou le -2.

Oui, mais alors toute modification du tableau (par exemple colonne B) entraine le recalcul d'une colonne entière (C).

Edit : avec =Crochets($A11;COLONNE(A11)) en B11 cela devrait aller.

A+
 
Dernière édition:
Re : Extraire un groupe de caractères vers une seule cellule, selon condition

Bonsoir

Le Forum, Le Fil, job75, david84

Edit : avec =Crochets($A11;COLONNE(A11)) en B11 cela devrait aller.

Je viens de tester avec ce code, très bien!
Pas de plantage.

Quant aux problèmes de plantage que vous signalez, ils doivent provenir du recalcul des feuilles.

N'auriez-vous pas des fonctions volatiles comme MAINTENANT DECALER ou INDIRECT ?

Je n'ai aucune formule supplémentaire.

Test avec 450 lignes et 250 colonnes, en exécutant la durée: 3,91 s

Bravo!

Je testerai en semaine sur fichier lieu de travail.

Merci pour votre disponibilité, pour tout.
 
- 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