Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Recherchev doublons

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

lego35

XLDnaute Junior
Bonjour le Forum,

je ne sais pas si c'est possible sous excel !!! mais moi je n'y arrive pas... entre la recherchev avec doublons, ou Equiv, Index, Décaler, et les doubles critères dans une même colonne, je suis perdu.

Petit fichier pour exemple,

et par avance merci de votre aide.

Cdlt
Lego35
 

Pièces jointes

Re : Recherchev doublons

Bonjour.
Oui, ça vaudrait mieux. Faites le à peu près, parce que dès que j'estimerai que, dans votre propre intérêt, vous aurez un peu assez travaillé, je vous fournirai bien le mien, où c'est fait proprement, avec des bordures verticales plus épaisses entre les mois notamment.
 
Re : Recherchev doublons

Où en est votre programmation ? Mettez juste le code où vous en êtes entre balises :
Code:
[code=vb]Le code
[/CODE]Exemple pour le début :
Code:
[code=vb]Private Sub Worksheet_Activate()
Dim M As Long, Plg As Range, Te(), Le&, Ts(), Ls&, _
   Données As Collection, Nom As SsGroup, Prénom As SsGroup, _
   Mois As SsGroup, Typ As SsGroup, TotJ As Double, Détail
[/CODE]Pour obtenir :
VB:
Private Sub Worksheet_Activate()
Dim M As Long, Plg As Range, Te(), Le&, Ts(), Ls&, _
   Données As Collection, Nom As SsGroup, Prénom As SsGroup, _
   Mois As SsGroup, Typ As SsGroup, TotJ As Double, Détail
Je vous signalerai chaque fois la 1ère instruction qui ne sera pas correcte, en vous expliquant pourquoi, jusqu'à ce que ce soit bon à 99%
À vous d'essayer d'adapter du mieux que vous pourrez pour qu'on n'y passe pas la semaine !

Remarque: À la réflexion on pourrait faire l'économie du SsGroup Typ en affectant M * 2 + Te(Le, 3) - 8 au lieu de M à Ts(Ls, 3), et en regroupant Mois et Typ en une seule variable Colonne As SsGroup. Ça devrait d'ailleurs entrainer moins de modifications. Voulez vous que je fasse la modification dans ce sens de mon coté ?
 
Dernière édition:
Re : Recherchev doublons

re, Dranreb

Je t'avoue avoir essayer. Après avoir changer le tableau j'ai pu essayer de reconstruire la macro avec les données de ton post (plus haut), rien à faire... des erreurs, des erreurs, objet requis, de compilation, de syntaxe et j'en passe...
Peut-être que le nouveau tableaux 'dans l'onglet "EXEMPLE" n'est pas dans la physionomie de ta pensée VBA, je sais pas.
Bon je revenu à l'original mais maintenant j'ai même plus de résultat. que faire ? soit c'est la premier ligne qui se trouve fluorée en jaune, soit la dernière. j'ai mis le fichier en pièce jointe.. ai-je fait une bêtise.

Cdlt
Lego
 

Pièces jointes

Re : Recherchev doublons

Ben ça ne plante que tout à la fin parce qu'il manque le nom de plage "Résultat" que j'avais mis dans le classeur à =$A$3:$Z$9
Cela dit je ne vois pas beaucoup de changement dans le code. Alors la 1ère chose qui ne va pas c'est :
Il y a toujours un seul SsGroup déclaré derrière celui qui s'appelle Prénom, mais il s'appelle toujours encore Mois. Il en faut soit un, d'accord, mais qui s'appelle Colonne soit deux, un Mois et un Typ (on ne peut pas l'appeler Type: c'est un mot réservé du langage)

Ne joignez pas chaque fois le classeur, mettez juste le code dans le poste entre balises highlight=vb comme indiqué plus haut.

Remarque: Le type de donnée SsGroup est défini par le module de classe du même nom. Examinez le: vous y trouverez des commentaires explicatifs comme dans tous mes modules de service.
 
Dernière édition:
Re : Recherchev doublons

Merci encore de votre aide mais c'est pas facile...

Et comme ça.

[QUOTErivate Sub Worksheet_Activate()
Dim M As Long, Plg As Range, Te(), Le&, Ts(), Ls&, _
Données As Collection, Nom As SsGroup, Prénom As SsGroup, _
Mois As SsGroup, Typ As SsGroup, TotJ As Double, Détail
ReDim Ts(1 To 2000, 1 To 4)
For M = 1 To 12
Set Plg = ColUti(Worksheets(M).[A4:F4])
If Not Plg Is Nothing Then
Te = Plg.Value
For Le = 1 To UBound(Te)
If Te(Le, 3) = 9 Or Te(Le, 3) = 10 Then
Ls = Ls + 1
Ts(Ls, 1) = Te(Le, 1) ' Nom
Ts(Ls, 2) = Te(Le, 2) ' Prénom
Ts(Ls, 3) = M
Ts(Ls, 4) = Te(Le, 3) ' Typ
Ts(Ls, 5) = Te(Le, 6) ' Nbr. Jrs
If Ls = 0 Then Exit Sub
MClassement.DernièreLigneIdx = Ls
Set Données = GroupOrg(Ts, 1, 2, 3, 4)
Ls = 0
For Each Nom In Données: Ls = Ls + Nom.Count: Next Nom
ReDim Ts(1 To Ls, 1 To 14)
Ls = 0
For Each Nom In Données
For Each Prénom In Nom.Contenu
Ls = Ls + 1
Ts(Ls, 1) = Nom.Id
Ts(Ls, 2) = Prénom.Id
For Each Mois In Prénom.Contenu
TotJ = 0
For Each Détail In Mois.Contenu
TotJ = TotJ + Détail(3)
Next Détail
If TotJ > 0 Then Ts(Ls, Mois.Id + 2) = TotJ
Next Mois, Prénom, Nom
ValPlgAju(Me.[Résultat]) = Ts
Me.[Résultat].RowHeight = 24
End Sub

][/QUOTE]

Ca n'a pas l'air...

Cdlt
Lego
 
Re : Recherchev doublons

Alors là, la 1ère erreur que je vois c'est ReDim Ts(1 To 2000, 1 To 4).
Ça ne va pas, car plus loin vous affectez quelque chose à une 5ième colonne. Ça doit sûrement vous faire une erreur Indice en dehors de la plage. Il faut donc ReDim Ts(1 To 2000, 1 To 5)
Mais c'est pas mal du tout.
Allez, je vous en signale 3 autres:
Un autre Redim à corriger: vous allez avoir besoin de 26 colonnes et non plus 14 pour le tableau à l'image du résultat.
Il faut intégrer une boucle pour le sous-groupe Typ dans celle pour le Mois, et c'est elle qui contiendra la boucle la plus interne sur Détail.
La colonne d'arrivée n'est plus bonne: ce n'est plus Mois.Id + 2 mais Mois.Id * 2 + Typ.Id - 8. Vous comprenez ?
Notez qu'on pourrait calculer cette colonne de destination dès le départ. On n'aurait alors plus besoin d'un sous-groupe supplémentaire. Le Mois et Typ serait en quelque sorte fusionné en un seul qu'on appellerait Colonne, puisque ce n'est plus le mois.
Dommage que je n'y ai pas pensé plus tôt. Ça vous aurait fait moins de modifications. Déja dans la 1ère partie on aurait pu rester à 4 colonnes. Ça aurait donné:
VB:
            Ts(Ls, 1) = Te(Le, 1)             ' Nom
            Ts(Ls, 2) = Te(Le, 2)             ' Prénom
            Ts(Ls, 3) = Te(Le, 3) + M * 2 - 8 ' Colonne (Type 9, mois 1  —>  9 + 1 * 2 - 8 = 3 soit la colonne C)
            Ts(Ls, 4) = Te(Le, 6)             ' Nbr. Jrs
 
Re : Recherchev doublons

Bonjour Dranreb,

Il faut intégrer une boucle pour le sous-groupe Typ dans celle pour le Mois, et c'est elle qui contiendra la boucle la plus interne sur Détail.

Je ne vois pas.
c'est quand même compliqué... pour les néophytes.

Private Sub Worksheet_Activate()
Dim M As Long, Plg As Range, Te(), Le&, Ts(), Ls&, _
Données As Collection, Nom As SsGroup, Prénom As SsGroup, _
Mois As SsGroup, Typ As SsGroup, TotJ As Double, Détail
ReDim Ts(1 To 2000, 1 To 5)
For M = 1 To 12
Set Plg = ColUti(Worksheets(M).[A4:F4])
If Not Plg Is Nothing Then
Te = Plg.Value
For Le = 1 To UBound(Te)
If Te(Le, 3) = 9 Or Te(Le, 3) = 10 Then
Ls = Ls + 1
Ts(Ls, 1) = Te(Le, 1) ' Nom
Ts(Ls, 2) = Te(Le, 2) ' Prénom
Ts(Ls, 3) = M
Ts(Ls, 4) = Te(Le, 3) ' Typ
Ts(Ls, 5) = Te(Le, 6) ' Nbr. Jrs
If Ls = 0 Then Exit Sub
MClassement.DernièreLigneIdx = Ls
Set Données = GroupOrg(Ts, 1, 2, 3, 4)
Ls = 0
For Each Nom In Données: Ls = Ls + Nom.Count: Next Nom
ReDim Ts(1 To Ls, 1 To 26)
Ls = 0
For Each Nom In Données
For Each Prénom In Nom.Contenu
Ls = Ls + 1
Ts(Ls, 1) = Nom.Id
Ts(Ls, 2) = Prénom.Id
For Each Mois In Prénom.Contenu
TotJ = 0
For Each Détail In Mois.Contenu
TotJ = TotJ + Détail(3)
Next Détail
If TotJ > 0 Then Ts(Ls, Mois.Id * 2 + Typ.Id - 8) = TotJ
Next Mois, Prénom, Nom
ValPlgAju(Me.[Résultat]) = Ts
Me.[Résultat].RowHeight = 24
End Sub

Et si en plus on ajoute de la réflexion à ce que l'on aurait pu faire avant... je vais pas y arriver! mais c'est bien on est toujours en mouvement... dans sa tête.

Bon c'est pas tout; comme dit plus haut, il faut pas y passer la semaine...
A+

Cdlt

Lego
 
Re : Recherchev doublons

Bonjour.

Précision: Il y a maintenant un ensemble de sous-groupes supplémentaire dans ceux des mois. Par conséquent celui du mois ne contient pas encore les infos de détail dont on a besoin. On ne peut donc plus obtenir chaque Détail dans Mois.Contenu, il faut d'abord prendre chaque Typ dans Mois.Contenu, et alors seulement For Each Détail In Typ.Contenu.
Mais on ne serait pas obligé d'imbriquer cette boucle supplémentaire, ni du sous-groupe Typ, si on calculait dès le départ la colonne d'arrivée dans Ts(Ls, 3) pour le sous-groupe du 3ième niveau, dont l'Id serait directement ce numéro de colonne au lieu du mois M.
C'est ce que j'ai préféré faire en fin de compte. Je laisse quand même derrière, en commentaires, la version dans laquelle on s'est engagé. Je vous conseille de la mettre quand même au point et de bien comprendre tout ça, avant d'utiliser la définitive. Car si vous me dite un jour que vous avez ajouté une nouvelle colonne devant tout ça, ou quelque chose comme ça, ce sera à vous de faire les adaptations nécessaires, je n'interviendrai plus, que ce soit bien clair. À moins bien sûr que ça doive faire appel à d'autres fonctionnalités des modules de service, bref, que ce soit autre chose que du réchauffé pour moi.
Mais pour l'instant, n'hésitez pas à m'interroger encore sur des détails que vous auriez du mal à comprendre, mettez mes réponses en commentaires derrières les instructions, afin d'acquérir la maitrise nécessaire à cette maintenance.
 

Pièces jointes

Dernière édition:
Re : Recherchev doublons

Merci Dranreb,

Oui oui ! je promets de regarder ça.

Vous êtes super "Papa", et pas utile de rajouter d'autres éloges.

Bien sûr tout le forum est sympa mais vous plus plus !!
Mon problème est résolu !!

Bien à vous

Cdlt
Lego
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
497
Réponses
2
Affichages
153
Réponses
2
Affichages
241
Réponses
1
Affichages
359
Réponses
5
Affichages
214
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…