Dissociation texte dans 2 colonne sans longeur fixe

Bonjour,

Je suis à la recherche d'une fonction particulière pour mon fichier excel.

Je vous joins l'exemple ci joint :

Le Rope Brush de Béal est l'outil permettant de nettoyer les cordes dans l'eau avec la lessive pour corde Rope Cleaner de Béal. Il vous suffit de visser le Rope Brush sur la corde et de la faire coulisser en maintenant le Rope Brush dans l'eau. Il s'adapte à tous les diamètres de corde.

Caractéristiques :

  • S'adapte à tous les diamètres
  • A nettoyer dans l'eau
Lieu de fabrication : France

Poids annoncé par le fournisseur : 50g

Poids pesé en magasin : 60g avec l'emballage

Je voudrais à partir du mot "caractéristiques :" transférer tous le contenu dans une colonne nommées CARACTERISTIQUES.

Puis réitérer cette opération pour le "Lieu de fabrication" dans un nouvelle colonne NATIONALITE

Sachant que les phrases n'ont pas la même longueur je ne sais pas comment gérer cette demande pour ensuite l'appliquer à tous mes produits.

Auriez-vous une idée car je ne suis pas très douée sur excel mais je sais que les possibilitéS sont grandes.

Merci d'avance pour votre aide.

Bonjour, bonjour !

Bonjour

bien venue

un fichier plus explicatif pourrais peu être aider plus

merci

Je vous joint un aperçu de quelques articles de ma Base de données actuel pour effectuer la modification.

Colonne à modifier est la Description

A partir de "caractéristique" transférer les infos dans la colonne CARACTÉRISTIQUE.

A partir de "Lieu de fabrication" transférer les infos dans la colonne NATIONALITÉ.

LeYéti a écrit :

A partir de "Lieu de fabrication" transférer les infos dans la colonne NATIONALITÉ.

Mettre alors une pièce jointe avec des données en relation !

Je ne comprend pas ma pièce jointe est bien présente dans ma réponse précédente.

Les informations a traiter se trouve toutes dans la colonne de base de la description et sont ensuite a dispatcher dans les colonnes caractéristique et nationalité.

Bonjour,

La chaine "Lieu de fabrication:" n'est présente nulle part.

eric

Ouuupppsss je ne voyais pas ou se situé l'erreur j'ai refais mes copier / coller avec les lieux de fabrication

Désolé.

Un essai.

Sélectionner la plage à traiter et lancer la macro. Ca peut-être toute la colonne AG, je réduis au minimum nécessaire, ligne 1 exclue.

J'ai joué la sécurité pour éviter les fausses manip : une valeur n'est mise que si la cellule réceptrice est vide, je n'écrase rien. Les 2 cellules à droite de la sélection doivent donc être vides pour être traitées. A toi de faire le ménage avant si tu veux mettre à jour.

Tu n'as pas donné la taille de ta base, j'ai supposé que ce n'était pas 100000 lignes. Sinon il faudra un peu de temps.

Il va falloir que tu choisisses entre "Caractéristiques:" et "Caractéristiques :". J'espère que ton fichier est plus rigoureux que l'exemple fourni.

eric

Malgré la non homogénéité des données,

voici quand même une p'tite démonstration efficace reposant principalement sur la fonction Split :

Sub Demo1()
    Application.ScreenUpdating = False

    With Feuil1.Cells(1).CurrentRegion
        For R& = 2 To .Rows.Count
            With .Cells(R, 33)
                                      S$ = Replace$(.Value, vbCr, "")
                                      SP = Split(S, "Caractéristiques:")
                If UBound(SP) = 0 Then SP = Split(S, "Caractéristiques :")
                If UBound(SP) > 0 Then .Offset(, 1).Value = Split(SP(1), vbLf & vbLf)(0)
                         SP = Split(S, "Lieu de fabrication : ")
                If UBound(SP) > 0 Then .Offset(, 2).Value = Split(SP(1), vbLf)(0)
            End With
        Next
    End With
End Sub

Et avec une homogénéité forcée par code :

Sub Demo2()
    Application.ScreenUpdating = False

    With Feuil1.Cells(1).CurrentRegion
        For R& = 2 To .Rows.Count
            With .Cells(R, 33)
                         S$ = Replace$(Replace$(.Value, vbCr, ""), " : ", ":")
                         SP = Split(S, "Caractéristiques:" & vbLf)
                If UBound(SP) > 0 Then .Offset(, 1).Value = Split(SP(1), vbLf & vbLf)(0)
                         SP = Split(S, "Lieu de fabrication:")
                If UBound(SP) > 0 Then .Offset(, 2).Value = Split(SP(1), vbLf)(0)
            End With
        Next
    End With
End Sub

Bonjour,

Nettement plus court, efficace

eric

En respectant la règle TBTO, c'est à dire en respectant le B-A-BA de la programmation objet d'Excel,

le code s'en trouve donc simplifié et forcément efficace …

Heuuu, pas beaucoup d'objets manipulés là.

C'est plutôt du traitement de chaine non ?

eric

En fait je n'évoquais pas la solution par Split car la voie classique des autres fonctions VBA de texte est parfois inévitable

mais plutôt de la manière d'accéder aux objets.

Comme par exemple dans ton code la création d'une variable pour la plage de cellules, mais bon, les goûts, les couleurs …

Ok. Oui, un peu plus tarabiscoté...

J'étais parti sur l'idée de pouvoir l'appliquer sur une sélection réduite que ce soit au plus rapide sur une mise à jour.

eric

Pour une question de rapidité, surtout dans le cas de milliers de lignes à traiter,

mieux vaut utiliser des variables de type tableau en lecture mais surtout en écriture de plage de cellules :

Sub Demo3()
    With Feuil1.Cells(1).CurrentRegion
        L& = .Rows.Count - 1
        VA = .Cells(2, 33).Resize(L).Value
        ReDim TB(1 To L, 1 To 2)

        For R& = 1 To L
               VA(R, 1) = Replace(Replace(VA(R, 1), vbCr, ""), " : ", ":")
                     SP = Split(VA(R, 1), "Caractéristiques:" & vbLf)
            If UBound(SP) > 0 Then TB(R, 1) = Split(SP(1), vbLf & vbLf)(0)
                     SP = Split(VA(R, 1), "Lieu de fabrication:")
            If UBound(SP) > 0 Then TB(R, 2) = Split(SP(1), vbLf)(0)
        Next

        With .Cells(2, 34).Resize(L, 2)
                    SP = .Cells(1).RowHeight
                .Value = TB
            .RowHeight = SP
        End With
    End With
End Sub
Rechercher des sujets similaires à "dissociation texte colonne longeur fixe"