tri sur chaine de caractère en vba

julbute

XLDnaute Junior
Bonjour à tous,
voici plusieurs jours que je "bute" sur un problème qui ne doit pas être insurmontable mais ...
Le voici , c'est une chaine dans un cellule de ce type :

Choix / poire & Choix / pomme & Choix / banane & Prime / poire & Prime / pomme & Prime / banane & Depart / poire & Depart / pomme & Départ / banane

Voici ce que j'aimerai retrouver dans la même cellule après un petit traitement en VBA.

Choix : poire,pomme,banane | Prime : cerise,prune,ananas | Départ : kiwi,orange,tomate

En sachant que le nom de l'intitulé (Choix,Prime,Départ) et fruit ne sont pas forcement les mêmes à chaque fois.

merci de votre aide.
 

eriiic

XLDnaute Barbatruc
Re : tri sur chaine de caractère en vba

Bonsoir,

on aura du mal à te faire de la prune avec de la banane mais on va essayer.
Code:
Sub traitement()
    Dim Dict, c As Range, pl() As Variant, result As String
    Dim item As Variant, item2 As Variant, i As Long
    Set Dict = CreateObject("Scripting.Dictionary")
    For Each c In Selection
        item = Split(c, "&")
        For i = 0 To UBound(item)
            item2 = Split(item(i), "/")
            Dict(Trim(item2(0))) = Dict(Trim(item2(0))) & "," & Trim(item2(1))
        Next i
        item = Dict.keys
        item2 = Dict.items
        result = ""
        For i = 0 To UBound(item)
            result = result & " | " & item(i) & " : " & Mid(item2(i), 2)
        Next i
        c.Offset(, 1) = Mid(result, 4)
    Next c
End Sub
Agit sur la sélection en cours, tu mettras la plage concernée si tu veux.
Je colle dans la cellule de droite pour les tests. Il faudra enlever le .Offset(, 1) à la fin.

eric

Ps: impossible d'obtenir de la prune, désolé
 

Pièces jointes

  • Classeur2.xls
    24.5 KB · Affichages: 61
  • Classeur2.xls
    24.5 KB · Affichages: 75
  • Classeur2.xls
    24.5 KB · Affichages: 77

julbute

XLDnaute Junior
Re : tri sur chaine de caractère en vba

Bonjour Eric,
merci pour ce prompt retour...
La confiture est parfaite, malgré les différences de goût!

Ce code est plutôt complexe pour moi,je ne connaissais pas ces instructions.
je dois l'adapter, je dois "boucler" sur une série de cellule, dans la colonne "K". D'autres données se trouvent sur la droite de la cellule à trier.Je dois les conserver.
A la fin de la chaine le tri ne rassemble pas tout les éléments.
Le dernier à priori.
Voici le résultat:
Choix : poire,pomme,banane | Prime : poire,pomme,banane | Depart : poire,pomme | Départ : banane.

J'ai fais une petite recherche sur CreateObject("Scripting.Dictionary").
Je vais essayer de comprendre le mécanisme de l'ensemble.

Merci de votre aide, Eric.
Roger
 

eriiic

XLDnaute Barbatruc
Re : tri sur chaine de caractère en vba

Bonsoir,

2 fois le même message à 20 min d'intervalle. Je confirme, tu es bien en mode bouclage ;-)
Tu as sans doute trouvé depuis mais sur l'excellent site de jacques boisgontier tu trouveras une description, et plusieurs exemple d'utilisation du dictionary.

eric
 

julbute

XLDnaute Junior
Re : tri sur chaine de caractère en vba

Une petite mauvaise manipulation...
J'ai modifie comme cela, ce n'est surement pas très orthodoxe, mais...

Sub traitement()
Dim Dict, c As Range, pl() As Variant, result As String
Dim item As Variant, item2 As Variant, i As Long

Dim ligne As Long
Dim a As Long



ligne = ActiveSheet.Range("a65536").End(xlUp).Row

For a = 1 To ligne

Set Dict = CreateObject("Scripting.Dictionary")
Cells(a, 1).Activate ' Cela ne me plait pas beaucoup ici...

For Each c In Selection
item = Split(c, "&")
For i = 0 To UBound(item)
item2 = Split(item(i), "/")
Dict(Trim(item2(0))) = Dict(Trim(item2(0))) & "," & Trim(item2(1))
Next i
item = Dict.keys
item2 = Dict.items
result = ""
For i = 0 To UBound(item)
result = result & " | " & item(i) & " : " & Mid(item2(i), 2)
Next i
'c.Offset(, 1) = Mid(result, 4)
c = Mid(result, 4)

Next c

Next a

End Sub


Cela fonctionne sur le classeur2 que tu m'as envoyé.

Cependant sur le fichier ou je suis en train d'essayer de faire fonctionner la macro.
J'ai un message d'erreur.
Je cherche...
Roger
 

Pièces jointes

  • Capture1.JPG
    Capture1.JPG
    64.4 KB · Affichages: 89
  • Capture1.JPG
    Capture1.JPG
    64.4 KB · Affichages: 111
  • Capture1.JPG
    Capture1.JPG
    64.4 KB · Affichages: 94
  • Capture0.JPG
    Capture0.JPG
    18.1 KB · Affichages: 77
  • Capture0.JPG
    Capture0.JPG
    18.1 KB · Affichages: 84
  • Capture0.JPG
    Capture0.JPG
    18.1 KB · Affichages: 94

eriiic

XLDnaute Barbatruc
Re : tri sur chaine de caractère en vba

Bonjour,

sans doute qu'une la cellule ne respecte pas le format attendu avec / et &
Cells(a, 1).Activate ' Cela ne me plait pas beaucoup ici...
Tu peux remplacer ton for next par :
Code:
Set Dict = CreateObject("Scripting.Dictionary")
    ligne = Range("a65536").End(xlUp).Row
    For Each c In [A1].Resize(ligne)
    ...

eric
 

julbute

XLDnaute Junior
Re : tri sur chaine de caractère en vba

Bonjour Éric,
Le fait de changer la boucle for/next par ce que tu a proposé à résolu mon problème.
Milesssss merci


Roger


Comment fait on pour fermer la discutions et mettre résolu?
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 297
Messages
2 086 972
Membres
103 412
dernier inscrit
antoire