Excel : déconcatener et ordonner

Résolu/Fermé
kitpost - 19 déc. 2011 à 17:12
 kitpost - 20 déc. 2011 à 13:33
Bonjour,





J'ai une problèmatique assez complexe.

J'ai des clients qui choississent plusieurs attributs pour filtrer des produits dans des pages.
Je récupère les attributs choisis dans des fichiers excel séparés par des "$".
Ces attributs peuvent être plusieurs et comportent une valeur.

Ex :
A1 : Âge:6mois-1an$Couleur:vert
A2 : Taille:S
A3 : Couleur:Jaune$Taille:M

Je souhaiterai obtenir à la fin un tableau recap du genre avec en colonne les attributs et dans les lignes correspondantes la valeur de l'attribut
si colonne B = âge; colonne C = taille; colonne D = couleur

B1 = 6mois-1an et D1 = vert
C2 = S
D3 = jaune et C3 = M


J'ai déjà trouvé quelques bidouilles et réussi à obtenir le résultat voulu mais sur de petits volumes.
J'ai environ 30 attributs différents sélectionnables (soit 30 colonnes) pour 11 000 sélections différentes (soit 11 000 lignes).

Quelqu'un aurait-il une piste ?
Je précise que je me débrouille avec excel (mais visiblement pas assez) et que je ne connais pas grand chose au VBA.
A voir également:

5 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
20 déc. 2011 à 12:58
Re,

J'avais mal placé la correction.
Ca devrait aller mieux avec ça :
Function extraitAtt(cellule As Range, attribut As String)
    Dim p As Long
    p = InStr(UCase(cellule.Value), UCase(attribut) & ":")
    If p > 0 Then
        extraitAtt = Split(Mid(cellule, p + Len(attribut) + 1), "$")(0)
    Else
        extraitAtt = ""
    End If
End Function

eric
1
Cette fois-ci, je n'arrive plus à trouver d'erreur !

Merci encore beaucoup, ton aide a été plus que précieuse.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
Modifié par eriiic le 19/12/2011 à 18:57
Bonjour,

Une proposition avec une fonction personnalisée en vba :
Function extraitAtt(cellule As Range, attribut As String) 
    Dim p As Long 
    p = InStr(UCase(cellule.Value), UCase(attribut)) 
    If p > 0 Then 
        extraitAtt = Split(Mid(cellule, p + Len(attribut) + 1), "$")(0) 
    Else 
        extraitAtt = "" 
    End If 
End Function

Ex syntaxe :
=extraitAtt($A2;"Taille")
ou
=extraitAtt($A2;B$1)
à recopier vers la droite et vers le bas

https://www.cjoint.com/?ALts4hZVGmZ

eric
0
Bonjour Eric,

Merci beaucoup pour cette réponse, beaucoup plus rapide et surtout beaucoup plus optimale que celle que j'espérais.

1 remarque cependant (ça ne serait pas drôle sinon) que je n'avais pas spécifiée au départ.
Dans mes attributs comme "Tailles" par exemple, il m'arrive d'avoir "Type" et "Type de sport" par exemple.
Avec ton programme, dans la colonne Type j'obtiens "de sport : Basket" et dans la colonne "Type de sport" j'obtiens "Basket". Je ne devrais obtenir que la deuxième partie.
Aurais-tu une solution pour cette spécificité ?
Je ne sais absolument pas si c'est complexe ou non dans le codage.

Si jamais c'était complexe à faire, tant pis, je te remercie déjà beaucoup pour ton aide, tu as réussi à débloquer un sujet plus que complexe pour moi.

Merci encore,
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
Modifié par eriiic le 20/12/2011 à 11:45
Bonjour,

Tu peux déposer un fichier exemple ou une ligne de donnée avec ce pb, je n'arrive pas à reproduire...

Ou bien essaie avec :
Function extraitAtt(cellule As Range, attribut As String) 
    Dim p As Long 
    p = InStr(UCase(cellule.Value & ":"), UCase(attribut)) 
    If p > 0 Then 
        extraitAtt = Split(Mid(cellule, p + Len(attribut) + 1), "$")(0) 
    Else 
        extraitAtt = "" 
    End If 
End Function

eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Voici l'exemple : http://cjoint.com/?0Lumfwowujx

Je teste ta nouvelle solution de suite.

Merci
0
Non, le rajout du & ":" ne corrige pas ce problème
0