[HELP] Trier des données selon un critère

alex75

XLDnaute Nouveau
Bonjour à tous,

Je suis débutant dans excel, et j'ai un besoin urgent que je n'arrive pas à résoudre.

Je m'explique, j'ai un tableau trié selon des utilisateurs et je voudrais le trier par profil et non plus pas utilisateur.

Chaque profil peut contenir X utilisateurs, j'ai donc besoin de récupérer la liste d'utilisateurs pour chacun des profils.

Vous trouverez un exemple en pièce jointe de ce que je souhaite réaliser.

J'attends vos lumières avec impatience,
Merci pour votre aide précieuse

alex [file name=classeurAlex.zip size=1778]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeurAlex.zip[/file]
 

Pièces jointes

  • classeurAlex.zip
    1.7 KB · Affichages: 28
  • classeurAlex.zip
    1.7 KB · Affichages: 30
  • classeurAlex.zip
    1.7 KB · Affichages: 34

Hervé

XLDnaute Barbatruc
Bonjour alex

en piece jointe, une solution possible parmis d'autres en vba.

le code :

Sub Bouton1_QuandClic()
'necessite l'acitvation de la reference : microsoft scripting runtime
Dim data As New Dictionary
Dim tablo, valeur
Dim i As Integer
Dim j As Byte


tablo = Range('a1').CurrentRegion

For i = 2 To UBound(tablo)
       
For j = 2 To UBound(tablo, 2)
               
If Not tablo(i, j) = '' Then
                       
With data
                               
If .Exists(CStr(tablo(i, j))) = True Then
                                        valeur = .Item(tablo(i, j))
                                        .Remove (tablo(i, j))
                                        .Add Item:=valeur & ',' & tablo(i, 1), Key:=CStr(tablo(i, j))
                               
Else
                                        .Add Item:=tablo(i, 1), Key:=CStr(tablo(i, j))
                               
End If
                       
End With
               
End If
       
Next j
Next i

With Sheets('feuil2')
        .Range(.Cells(1, 2), .Cells(data.Count, 2)) = Application.Transpose(data.Items)
        .Range(.Cells(1, 1), .Cells(data.Count, 1)) = Application.Transpose(data.Keys)
End With

End Sub

attention : renvoi en feuille 2

j'ai opté pour la premiere présentation, pour la deuxieme, pas de problème.

salut [file name=classeurAlex_20060424164823.zip size=9380]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeurAlex_20060424164823.zip[/file]
 

Pièces jointes

  • classeurAlex_20060424164823.zip
    9.2 KB · Affichages: 35

alex75

XLDnaute Nouveau
Hervé écrit:
Bonjour alex

en piece jointe, une solution possible parmis d'autres en vba.

attention : renvoi en feuille 2

j'ai opté pour la premiere présentation, pour la deuxieme, pas de problème.

salut [file name=classeurAlex_20060424164823.zip size=9380]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeurAlex_20060424164823.zip[/file]

Alors là bravo, je te remercie vraiment, je serais incapable de réaliser ça tout seul, je suis encore trop petit dans excel:)

Je teste et vous tiens au courant
 

Hervé

XLDnaute Barbatruc
re alex

oui c'est possible comme ceci :


Sub Bouton1_QuandClic()
'necessite l'acitvation de la reference : microsoft scripting runtime
Dim data As New Dictionary
Dim tablo, valeur
Dim i As Integer
Dim j As Byte


'tablo = Range('a1').CurrentRegion
tablo = Selection

For i = 1 To UBound(tablo)
       
For j = 2 To UBound(tablo, 2)
               
If Not tablo(i, j) = '' Then
                       
With data
                               
If .Exists(tablo(i, j)) = True Then
                                        valeur = .Item(tablo(i, j))
                                        .Remove (tablo(i, j))
                                        .Add Item:=valeur & ',' & tablo(i, 1), Key:=tablo(i, j)
                               
Else
                                        .Add Item:=tablo(i, 1), Key:=tablo(i, j)
                               
End If
                       
End With
               
End If
       
Next j
Next i

With Sheets('feuil2')
        .Range(.Cells(1, 2), .Cells(data.Count, 2)) = Application.Transpose(data.Items)
        .Range(.Cells(1, 1), .Cells(data.Count, 1)) = Application.Transpose(data.Keys)
End With

End Sub


attention de bien sélectionner la colonne A avec tes données.

salut
 

Jocelyn

XLDnaute Barbatruc
Bonjour le Forum,
Bonjour Alex75, Hervé :)

bon alors aprés la proposition en macro que personnellement je préfére voila une solution en formule matricielle basée sur la présentation numéro 2.

Jocelyn [file name=classeurAlex_20060424171023.zip size=9918]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeurAlex_20060424171023.zip[/file]
 

Pièces jointes

  • classeurAlex_20060424171023.zip
    9.7 KB · Affichages: 26

alex75

XLDnaute Nouveau
Hervé écrit:
re alex

attention de bien sélectionner la colonne A avec tes données.

salut

En fait, j'ai le pb suivant, je pensais que mon premier exemple serait adapter à mon besoin mais apparemment le script que tu m'as gentiment codé ne fonctionne pas avec mes données (cf fichier joint).

Est-ce parce que le résultat concaténé est trop grand et il ne peut être insérer dans une seule cellule ou est-ce un autre problème?

Je suis vraiment désolé mais je n'ai aucune connaissance en VB donc pas évident de débuter ainsi :)

Merci encore pour ton aide, j'apprécie sincèrement.

Alex
 

alex75

XLDnaute Nouveau
Jocelyn écrit:
Bonjour le Forum,
Bonjour Alex75, Hervé :)

bon alors aprés la proposition en macro que personnellement je préfére voila une solution en formule matricielle basée sur la présentation numéro 2.

Jocelyn [file name=classeurAlex_20060424171023.zip size=9918]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/classeurAlex_20060424171023.zip[/file]

Salut Jocelyn, merci à toi pour ton aide et je suis tout à fait d'accord avec ta signature :)

Par contre, je n'ai pas compris comment marchait la solution que tu proposes... ni comment la modifier :)
 

Jocelyn

XLDnaute Barbatruc
re,

alors je vais essayer de t'expliquer la formule,

dans un premier temps c'est une formule Matricielle elle est a validée pour cela quand la formule est fini d'ecrire il faut positionner le curseur a la fin de la formule et appuyer simulanément sur les touche ctrl+majuscule+entrée a ce moment apparait avant le signe = le signe{ et en fin de formule le signe}

autrement :

=INDEX(Feuil1!$A$1:$A$26;MIN(SI(Feuil1!$A$3:$A$27diferendde'';SI(Feuil1!$B$3:$F$27=Feuil2!$A1;SI(NB.SI($C1:C1;Feuil1!$A$3:$A$27)=0;LIGNE(Feuil1!$A$3:$A$27))))))&''

INDEX(Feuil1!$A$1:$A$26 veut dire que l'on regardé les valeur de cette plage et que l'on veux renvoyer la valeur de la ou les plus petite lignes LIGNE(Feuil1!$A$3:$A$27)a la condition 1 que les cellule de la plage ne soit pas vide Feuil1!$A$3:$A$27diferendde'' et condition 2 il y est sur la meme ligne la valeur de la cellule A1 de la feuille 2 soit pour C1 la valeur 'ds' Feuil1!$B$3:$F$27=Feuil2!$A1 condition 3 pour éviter les doublons que le nombre de nom rencntrer sur la ligne ne soit pas deja present sur la ligne 1 de la feuille 2 NB.SI($C1:C1;Feuil1!$A$3:$A$27)=0 le fait d'ecrire $c1:C1 permet de compter si l'on tire la formule vers la droite sur une plage $C1:C2

Voila j'espere que les explications sont clair.

Jocelyn

edit pour que la formule fonctionne il faut que le ligne 1 de la feuille 1 soit vide.

Message édité par: Jocelyn, à: 24/04/2006 17:58
 

alex75

XLDnaute Nouveau
Jocelyn écrit:
re,

alors je vais essayer de t'expliquer la formule,

dans un premier temps c'est une formule Matricielle elle est a validée pour cela quand la formule est fini d'ecrire il faut positionner le curseur a la fin de la formule et appuyer simulanément sur les touche ctrl+majuscule+entrée a ce moment apparait avant le signe = le signe{ et en fin de formule le signe}

autrement :

=INDEX(Feuil1!$A$1:$A$26;MIN(SI(Feuil1!$A$3:$A$27diferendde'';SI(Feuil1!$B$3:$F$27=Feuil2!$A1;SI(NB.SI($C1:C1;Feuil1!$A$3:$A$27)=0;LIGNE(Feuil1!$A$3:$A$27))))))&''

INDEX(Feuil1!$A$1:$A$26 veut dire que l'on regardé les valeur de cette plage et que l'on veux renvoyer la valeur de la ou les plus petite lignes LIGNE(Feuil1!$A$3:$A$27)a la condition 1 que les cellule de la plage ne soit pas vide Feuil1!$A$3:$A$27diferendde'' et condition 2 il y est sur la meme ligne la valeur de la cellule A1 de la feuille 2 soit pour C1 la valeur 'ds' Feuil1!$B$3:$F$27=Feuil2!$A1 condition 3 pour éviter les doublons que le nombre de nom rencntrer sur la ligne ne soit pas deja present sur la ligne 1 de la feuille 2 NB.SI($C1:C1;Feuil1!$A$3:$A$27)=0 le fait d'ecrire $c1:C1 permet de compter si l'on tire la formule vers la droite sur une plage $C1:C2

Voila j'espere que les explications sont clair.

Jocelyn

edit pour que la formule fonctionne il faut que le ligne 1 de la feuille 1 soit vide.Message édité par: Jocelyn, à: 24/04/2006 17:58

merci jocelyn :)
je viens de regarder de plus près mais pas évident de modifier et de l'adapter à mes besoins...

le mieux est que je vous fournisse le fichier excel d'origine :)

en sortie, il faudrait avec la liste de chacun des profils avec les noms associés... mais je n'y arrive pas malgré vos exemples.
 

alex75

XLDnaute Nouveau
Hervé écrit:
re alex

oui c'est possible comme ceci :


Sub Bouton1_QuandClic()
'necessite l'acitvation de la reference : microsoft scripting runtime
Dim data As New Dictionary
Dim tablo, valeur
Dim i As Integer
Dim j As Byte


'tablo = Range('a1').CurrentRegion
tablo = Selection

For i = 1 To UBound(tablo)
       
For j = 2 To UBound(tablo, 2)
               
If Not tablo(i, j) = '' Then
                       
With data
                               
If .Exists(tablo(i, j)) = True Then
                                        valeur = .Item(tablo(i, j))
                                        .Remove (tablo(i, j))
                                        .Add Item:=valeur & ',' & tablo(i, 1), Key:=tablo(i, j)
                               
Else
                                        .Add Item:=tablo(i, 1), Key:=tablo(i, j)
                               
End If
                       
End With
               
End If
       
Next j
Next i

With Sheets('feuil2')
        .Range(.Cells(1, 2), .Cells(data.Count, 2)) = Application.Transpose(data.Items)
        .Range(.Cells(1, 1), .Cells(data.Count, 1)) = Application.Transpose(data.Keys)
End With

End Sub


attention de bien sélectionner la colonne A avec tes données.

salut

Salut Hervé, comment faire pour mettre le résultat dans différente cellule au lieu de les séparer par une virgule? :unsure:
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 508
Messages
2 089 143
Membres
104 047
dernier inscrit
bravetta