Excel - Couper une chaîne de caractères

Résolu
carthagod Messages postés 59 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

J'ai un souci sur Excel :

Je cherche à couper des chaînes de caractères. J'ai une colonne avec des entrées du type :

www.monsite.com/categorie/souscategorie/mot-motbis-motter.html.

Je voudrais dans une colonne à côté de celle avoir "mot motbis motter".

Il faut donc que j'arrive à faire deux choses :
1. Déjà ça serait pas mal d'avoir dans une colonne la partie "mot-motbis-motter.html". Le souci est que la longueur et le nombre des catégories varie (je ne peux donc pas faire juste STXT)

2. il faut que je dégage les tirets et le .html.

Voilà le pb, j'espère que certains auront une solution à me proposer !

Merci beaucoup !

7 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    Si ton arborescence est toujours à 4 niveaux :
    =SUBSTITUE(STXT(GAUCHE(A1;NBCAR(A1)-5);CHERCHE("\";SUBSTITUE(A1;"/";"\";3))+1;100);"-";" ")

    EDIT:
    et si ton niveau d'arborescence peut varier, dans une cellule intermédiaire met :
    =SOMMEPROD((STXT(A1;LIGNE(INDIRECT("1:" & NBCAR(A1)));1)="/")*1)
    et remplace le 3 de la formule 1 par la référence de cellule de cette formule.

    et coucou à vaucluse au passage ;-)

    eric
    2
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonsoir
    essayez si cette formule s'adapte à tous vos cas de figures, sachant qu'elle se base sur les points suivants:
    le texte à ressortir se situe après le troisième slash
    la fin du texte se situe avant le deuxième point
    on verra pour les tirets après
    La formule s'adapte à un texte complet en A1
    Attention à tous les signes!!

    =STXT(A1;TROUVE("_";SUBSTITUE(A1;"/";"_";3);1)+1;TROUVE("*";SUBSTITUE(A1;".";"*";2);1)-TROUVE("_";SUBSTITUE(A1;"/";"_";3);1)-1)

    crdlmnt
    Ps pour enlever les tirets, c'est celle ci:
    =SUBSTITUE(STXT(A1;TROUVE("_";SUBSTITUE(A1;"/";"_";3);1)+1;TROUVE("*";SUBSTITUE(A1;".";"*";2);1)-TROUVE("_";SUBSTITUE(A1;"/";"_";3);1)-1);"-";" ")

    Demandons nous si nous ne sommes pas seuls à comprendre ce que l'on explique?
    1
    1. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
       
      Voila ce que ça donne pour ce qui me concerne.
      Et salut à Eriiiic bien sur :-)
      http://www.cijoint.fr/cjlink.php?file=cj201010/cijIYJkTJV.xls

      Crdlmnt à tous
      0
  3. TOUTOU84
     
    Voici comment je traite un pb analogue sur EXCEL.ça n'est pas élegant mais pour moi ça marche!!
    je n'ai pas réussi à recopier correctement une portion du tableur

    A B C D E F G H I J K L M N O P Q R
    1
    2
    3 www.monsite.com/categorie/souscategorie/mot-motbis-motter.html. 4 12 16 26 40 44 51 58 63
    4 .monsite com categorie souscategorie mot motbis motter html
    5 www.monsite.com/categorie/souscategorie/mot-motbis-motter.html. 4 12 16 26 40 44 51 58 63
    6 .monsite com categorie souscategorie mot motbis motter html
    7
    Fonctions utilisées pour "cadrer" les mots
    CHERCHE(".";$B4;4) CHERCHE(".";$B$4;H4+1) CHERCHE("/";$B$4;I4+1)
    Fonctions utilisées pour restituer les"mots"
    STXT($B4;H4;I4-H4-1) STXT($B4;I4+1;J4-I4-1)

    En espérant que cela pourra vous être utile.Sautations
    Adresse mail supprimée pour votre sécurité
    0
  4. carthagod Messages postés 59 Statut Membre 1
     
    Bonjour,

    Désolé pour la réaction tardive, je n'ai pas eu le temps de reprendre la question avant aujourd'hui.

    Merci beaucoup pour vos réponses. eriiic, la solution est parfaite, cela marche nickel ! Par contre je ne comprends clairement pas tout !

    J'ai compris la première partie, je ne comprends pas comment on trouve le nombre de / qu'il y a. (la formule =SOMMEPROD((STXT(A1;LIGNE(INDIRECT("1:" & NBCAR(A1)));1)="/")*1) ).

    Merci aussi à Vaucluse et toutou84 pour vos idées !

    Bonne journée
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    LIGNE(INDIRECT("1:" & NBCAR(A1))) génère une suite de nombres {1;2;3;...;62} de la longueur de la chaine.
    Elle sert à STXT pour extraire tous les caractères 1 à 1 pour obtenir une matrice : {"w";"w";"w";".";"m";"o";"n";"s";"i";"t";"e";".";"c";"o";"m";"/";"c"...;"l"}
    (formule matricielle qu'on devrait valider par shift+ctrl+entrée mais comme sommeprod() est une formule matricielle à elle toute seule on peut s'en dispenser)

    avec {...}="/" on obtient VRAI à chaque / :
    {FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;VRAI;...;FAUX}

    qui *1 donne :
    {0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;...;0}

    Il ne reste plus qu'à faire la somme des 1 avec sommeprod()

    eric
    0
  7. carthagod Messages postés 59 Statut Membre 1
     
    merci pour l'explication. Je vais me pencher dessus ce week end pour voir si je comprends.

    Sinon j'ai trouvé sur le web une autre solution pour compter le nombre de slash plus simplement :

    =LEN(B3)-LEN(SUBSTITUTE(B3;"/";""))

    (LEN=NBCAR)

    J'ai maintenant une belle colonne toute propre ! merci !

    bonne journée,
    Thomas
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      C'est vrai que c'est plus court... :-)
      eric
      0
  8. carthagod Messages postés 59 Statut Membre 1
     
    Salut Eric,

    J'ai à peu près compris ta formule, je ne comprends juste pas le rôle de indirect. que donne la fonction INDIRECT quand on lui donne comme variable une plage de cellule ?
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      Indirect() permet de fabriquer une référence à partir d'une chaine texte.
      =indirect("A1") est équivalent à =A1
      0