Séparé le contenu d'une cellule a partir d'un terme spécifique

winnie

XLDnaute Nouveau
Bonjour,

Je souhaiterais séparer le contenu d'une cellule en 2.

Je m'explique :

J'ai par exemple SARL Winnie en A1,

Je voulais savoir s'il était possible de diviser le contenu de la cellule,
=>c-a-d garder "winnie" en "A1 et avoir en A2 "SARL.

Je pense qu'une macro serait d'actualité.

Merci de me dire la faisabilité du projet.
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Bonjour le fil :),
A la demande de JM, je passe par là, sachant que RegExp n'est pas forcément la panacé dans ce cas de figure. En effet, il serait bien plus puissant si un réel motif pouvait être décelé (que des consonnes dans le sigle ou uniquement les sigles en majuscules par exemple) ce qui n'est pas le cas ici :eek:.
J'avoue que la solution de Tibo me plait bien, les seuls défauts que j'ai trouvés, c'est la perte de l'espace pour une raison sociale au milieu, et... que je n'ai pas trouvé comment agrandir la liste des exclusions dans sa formule :p.
Maintenant, si on veux s'amuser avec RegExp, le Pattern de JM n'est pas tout à fait bon, puisqu'il va transformer la société : SARL SARA PORTEPASMAL en PORTEPASMAL, par exemple, ce qui est dommage pour le jeu de mot :D...
Ça signifie donc qu'il va falloir travailler sur une liste exhaustive, à l'unité.
Pour récupérer la liste, j'ai été chercher le fichier de l'INSEE proposé par JM, et là, avec tout l'avantage de RegExp, j'ai extrait toutes les abréviations en me basant sur le fait que ce n'était que des ensembles de majuscules.
Code:
[COLOR=blue]Function[/COLOR] ExtractionSigles(Plage [COLOR=blue]As[/COLOR] Range) [COLOR=blue]As String[/COLOR]
Application.Volatile
[COLOR=blue]Dim[/COLOR] Match, Matches, Cellule [COLOR=blue]As[/COLOR] Range
[COLOR=blue]With[/COLOR] CreateObject("vbscript.regexp")
[COLOR=blue]For Each[/COLOR] Cellule [COLOR=blue]In[/COLOR] Plage
    .Global = [COLOR=blue]True[/COLOR]: .Pattern = "[A-Z]{2,}"
    [COLOR=blue]Set[/COLOR] Matches = .Execute(Cellule)
    [COLOR=blue]For Each[/COLOR] Match [COLOR=blue]In[/COLOR] Matches
    ExtractionSigles = ExtractionSigles & " " & Match
[COLOR=blue]Next[/COLOR]
[COLOR=blue]End With[/COLOR]
[COLOR=blue]End Function[/COLOR]
Il m'a suffit d'utiliser le séparateur blanc pour décomposer en cellules, copier/coller transposé et supprimer les doublons.
J'ai ensuite ajouté les civilités traditionnelles (j'ai laissé tombé Son Altesse Sérénissime, vu qu'elle existait déja dans les sociétés :p).
J'ai ensuite fait une petite fonction pour fabriquer mon Pattern
Code:
[COLOR=blue]Function[/COLOR] FabricationPattern(Plage [COLOR=blue]As[/COLOR] Range) [COLOR=blue]As String[/COLOR]
Application.Volatile
[COLOR=blue]Dim[/COLOR] Cellule [COLOR=blue]As[/COLOR] Range
[COLOR=blue]For Each[/COLOR] Cellule [COLOR=blue]In[/COLOR] Plage
FabricationPattern = FabricationPattern & "|" & Cellule
[COLOR=blue]Next[/COLOR]
FabricationPattern = " ?\b(" & Right(FabricationPattern, Len(FabricationPattern) - 1) & ")\b ?(?!\.)"
[COLOR=blue]End Function[/COLOR]
Là, quelque explications pour Winnie s'imposent :
" ?" : 0 ou 1 espace
"\b" : fin de mot devant
"(CUMA|GAEC|...)" : CUMA ou GAEC ou ...
"\b ?" : idem
"(?!\.)" : mais n'ayant pas un "." après (pour ne pas ôter le M de R.M.T.I. par exemple.
Maintenant, il ne reste plus qu'une petite fonction pour traiter tout cela ;) :
Code:
[COLOR=blue]Function[/COLOR] SansTitre(Cellule [COLOR=blue]As[/COLOR] Range, MonPattern [COLOR=blue]As String[/COLOR], [COLOR=blue]Optional[/COLOR] Remplacement [COLOR=blue]As String[/COLOR], [COLOR=blue]Optional[/COLOR] Inverse [COLOR=blue]As Boolean[/COLOR]) [COLOR=blue]As String[/COLOR]
Application.Volatile
[COLOR=blue]Dim[/COLOR] Match, Matches
[COLOR=blue]If[/COLOR] Cellule.Count > 1 [COLOR=blue]Then Exit Function[/COLOR]
[COLOR=blue]If[/COLOR] Inverse = [COLOR=blue]False Then[/COLOR]
[COLOR=blue]With[/COLOR] CreateObject("vbscript.regexp")
    .Global = [COLOR=blue]True[/COLOR]: .Pattern = MonPattern
    SansTitre = Trim(.Replace(Cellule, Remplacement))
[COLOR=blue]End With[/COLOR]
[COLOR=blue]Else[/COLOR]
    [COLOR=blue]With[/COLOR] CreateObject("vbscript.regexp")
        .Global = [COLOR=blue]True[/COLOR]: .Pattern = Replace(MonPattern, " ?", "")
        [COLOR=blue]Set[/COLOR] Matches = .Execute(Cellule)
        [COLOR=blue]For Each[/COLOR] Match [COLOR=blue]In[/COLOR] Matches
            SansTitre = SansTitre & " " & Match
        [COLOR=blue]Next[/COLOR]
    [COLOR=blue]End With[/COLOR]
    SansTitre = Trim(SansTitre)
[COLOR=blue]End If[/COLOR]
[COLOR=blue]End Function[/COLOR]
et lui donner les arguments suivants :
Code:
=SansTitre(Cellule_à_traiter;Pattern_à_utiliser;En_option_remplacer_par;En_option_l_inverse)
Je vous mets le comparatif en PJ.
Bonne journée :cool:

Ton explication est très claire et très instructive puisqu'elle me permet d'apprendre certaines choses.
Je commence sous VBA et j'apprend petit à petit.

En tout cas merci à toi comme aux autres, je vais tester cela de suite.
 

JNP

XLDnaute Barbatruc
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Re :),
Tu pourrais peut-être éviter de citer tous le message, le fil devient illisible :p.
Correctif pour Tibo, je suis vraiment fatigué, j'ai pas vu que c'était de la matricielle :eek:.
Donc j'ai pu corrigé la zone, et donc en dehors du blanc, si 2 mots successifs, ça n'en ôte qu'un. Mais c'est un cas extrême :rolleyes:.
Bonne journée :cool:
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Par contre j'aimerai pouvoir adapté cette macro à une autre cellule.

A savoir ma colonne APE :

4772A - COMMERCE DE DÉTAIL DE LA CHAUSSURE

Je voudrais séparé le code et le libellé. Apres le trait d'union j'aimerais qu'il soit supprimé mais ca je peux le faire manuellement avec recherché remplacé. Comme ca je ne complique pas trop ma demande.

Le code APE est toujours sous ce format (= 4chiffres, 1lettre, un espace, un trait d'union et un espace)

Je sais que je peux faire une formule de ce style
Code:
STXT(A1;1;4)
et pareil pour le libellé.

Mais le problème et que je dois ensuite importer ce fichier dans un autre logiciel et que lorsque cellule comporte une formule, le logiciel ne reconnait pas la colonne.

J'aurais donc aimé faire cela aussi sous forme de macro.

Merci
 

JNP

XLDnaute Barbatruc
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Re :),
Je sais que je peux faire une formule de ce style
Code:
STXT(A1;1;4)
et pareil pour le libellé.

Mais le problème et que je dois ensuite importer ce fichier dans un autre logiciel et que lorsque cellule comporte une formule, le logiciel ne reconnait pas la colonne.
Si tu copie tes cellules avec formules sur elles-mêmes en collage spécial "Valeurs", les formules seront remplacées par leur valeur ;).
Pour le code APE, tu peux utiliser
Code:
=GAUCHE(A1;5)
ou ma fonction
Code:
=SansTitre(A1;"\d{4}[A-Z]";;VRAI)
qui fonctionne même si le code APE est au milieu.
Pour le libellé
Code:
=DROITE(A1;NBCAR(A1)-8)
ou de nouveau ma fonction
Code:
=SansTitre(A1;"(\d{4}[A-Z]| - )")
Bon courage :cool:
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

j'avais déjà pensé à la copie en valeur, le problème étant que lorsque je fais cela, les nombres sont en format texte selon le commentaire de mes cellules.

Il m'est dis qu'il y a une apostrophe qui traine mais qui chez moi n'apparait pas.

J'avais essayé de changer le format pour le mettre en nombre standard mais cela n'a rien changé
 

JNP

XLDnaute Barbatruc
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Re :),
Depuis le début, tout est du texte :rolleyes:, même le code APE vu qu'il y a une lettre après :p...
Mais si tu as des nombres aussi, il te suffit de mettre un 1 dans une cellule, copier, sélectionner tes cellules à convertir en nombre et collage spécial multiplication. Tes '123 deviendront 123 :D.
Bon courage :cool:
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

en fait j'ai une dernière question..

je fais ma macro et je dis que je ne veux pas ce qu'il y a avant " - "
Code:
EXPRESSION = _
"(\d{4}[A-Z]| - )"

exemple : 4772A - COMMERCE DE DÉTAIL DE LA CHAUSSURE

j'ai réussi à le modéliser à partir des diverses info données. et ca me sort le libellé.

Par contre pour dire que je ne veux pas ce qui vient après " - " je l'écris comment?


promis c'est la dernière...(enfin pour aujourd'hui :p)

mais c'est en forgeant qu'on devient forgeron
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Rassure toi, j'utilise bien ta première fonction pour ma première demande.

Maintenant, j'ai commencé sous VBA il y a peu de temps.

J'aurais voulu l'utiliser pour ce cas ci, mais j'ai pas réussi à la modifier :(

Et comme j'ai l'impression d'abusé deja un peu, j'avais un peu honte d'en demander plus. Je me suis donc tourné vers la macro plus simple à appréhender.

voici l'explication
 

JNP

XLDnaute Barbatruc
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Re :),
Rassures toi, JNP_Obi ;) , moi je préfère tes jolis patterns ;)
J'ose espérer en découvrir plein d'autres de ta griffe ,au hasard des fils à venir sur XLD.
Je disais pas ça contre toi, mais je lui avais fourni la fonction qui va bien, et il y a fallu que je me repenche dans ta sub pour refaire un Pattern :p... Et dans ma fonction, c'est garder ce qu'il y a de bon ou le reste, alors que dans ta sub, c'est ôter ce qu'il y a de mauvais :D
Mais à force de jongler, je vais finir par apprendre ;).
Bonne soirée :cool:
 

winnie

XLDnaute Nouveau
Re : Séparé le contenu d'une cellule a partir d'un terme spécifique

Petit mot pour JNP,

J'ai mis à nouveau le nez dans ta fonction et essayé de comprendre. Je t'avoue que hier j'avais pas du tout compris le fonctionnement puisque c'étais la première fonction que je voyais de ma vie.

Mais en regardant de plus près, j'ai bien compris son fonctionnement et je dois dire chapeau bas l'artiste.
Et pour te rassurer je m'en sert, ton travail n'a pas était vain. :p
 

Discussions similaires

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 205
dernier inscrit
zch