Liste sans doublons et cellules vides

didousama

XLDnaute Nouveau
Bonjour,

Après de nombreuses recherches sur un peu tout les forums et ne trouvant pas chaussure à mon pied, je me décide à poster un message avec un fichier qui aidera pet être mieux à cibler ma demande.

J'ai un tableau ou pour une phase d'un projet pour chaque tâche intervient une ou plusieurs personnes pendant un certain nombres d'heures (une colonne par attribut : phase, tâche, personne, heures).

Je souhaiterais en fin de fichier faire une synthèse de toutes les personnes intervenant avec leurs total d'heures.

Je souhaiterais donc une liste sans doublons ou cellules vides reprenant les noms lister plus haut dans mes plages de cellules de chaque phase.

En remerciant d'avance ceux qui m'aideront à résoudre cette énigme.
 

Pièces jointes

  • exemple chiffrage projet.xlsx
    14.8 KB · Affichages: 52

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste sans doublons et cellules vides

Bonsoir,

cf PJ

-Sélectionner G54:G63
=ListeTriée((D6:D15;D19:D28;D32:D41))
-Valider avec majusc+ctrl+entrée

-Sélectionner H54:H63
=SOMME.SI($D$6:$D$41;G54:G63;$E$6:$E$41)
-Valider avec majusc+ctrl+entrée

ListeTriée((champ1;champ2;....)) est une fonction perso

-Alt+F11
-Insertion/Module

Code:
Function ListeTriée(champ)
  Application.Volatile
  Set mondico = CreateObject("Scripting.Dictionary")
  n = 0
  For i = 1 To champ.Areas.Count      ' parcours des zones du champ multi-zones
    n = n + champ.Areas(i).Count
    For j = 1 To champ.Areas(i).Count ' parcours des éléments d'une zone
      If champ.Areas(i)(j) <> "" And champ.Areas(i)(j) <> "." Then
        x = champ.Areas(i)(j)
        mondico.Item(x) = x      ' ajout au dictionnaire (doublons éliminés)
      End If
    Next j
  Next i
  temp = mondico.items           'transfert dictionnaire dans une table temp()
  Call Tri(temp, LBound(temp), UBound(temp))   ' tri optionnel
  Dim d():  ReDim d(n)           ' table pour retour
  For i = LBound(temp) To UBound(temp):  d(i) = temp(i): Next i
  ListeTriée = Application.Transpose(d)
End Function

Sub Tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
   Do While a(g) < ref: g = g + 1: Loop
   Do While ref < a(d): d = d - 1: Loop
   If g <= d Then
    tmp = a(g): a(g) = a(d): a(d) = tmp
    g = g + 1: d = d - 1
   End If
  Loop While g <= d
 If g < droi Then Call Tri(a, g, droi)
 If gauc < d Then Call Tri(a, gauc, d)
End Sub

JB
 

Pièces jointes

  • exemple chiffrage projet.xls
    49.5 KB · Affichages: 61
Dernière édition:

didousama

XLDnaute Nouveau
Re : Liste sans doublons et cellules vides

Bonsoir,

Merci pour cette réponse,

Je vais la tester sur mon fichier de travail.

Mais à tout hasard, je pose la question en pensant que ca ne doit pas être le cas : n'y a t-il aucune solution juste avec des formules sans entrer dans la programmation VBA?
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : Liste sans doublons et cellules vides

Bonjour à tous,

Avec une colonne supplémentaire et

En matricielle
Code:
=SIERREUR(INDIRECT("A"&MIN(SI(NB.SI($D$54:D54;Noms)<1;LIGNE(Noms))));"")
ou
Code:
=SI(ESTERREUR(INDIRECT("A"&MIN(SI(NB.SI($D$54:D54;Noms)<1;LIGNE(Noms)))));"";INDIRECT("A"&MIN(SI(NB.SI($D$54:D54;Noms)<1;LIGNE(Noms)))))
suivant la version

A+ à tous
 

Pièces jointes

  • JC Exemple chiffrage projet.xlsx
    18.4 KB · Affichages: 51
Dernière édition:

didousama

XLDnaute Nouveau
Re : Liste sans doublons et cellules vides

Bonjour,

Merci pour ces deux réponses qui fonctionnent à merveilles

Finalement, j'ai opter pour la version macro mais la version formule m'a fait découvrir aussi des choses qui pourront me servir plus tard.

Encore merci à vous!
 

didousama

XLDnaute Nouveau
Re : Liste sans doublons et cellules vides

Rebonjour,

Je reviens sur mon sujet pour remercier grandement BOISGONTIER pour sa formule ListeTriée puisque j'ai pu réutiliser cette formule à un autre endroit de mon fichier qui me posait problème.

Par contre, à la suite de ça, j'ai un nouveau problème :

J'utilise la formule matricielle {=CONCATENER(ListeTriée('Feuil1'!C6:C15)} dans la plage de cellules C7:C16 de ma Feuil2 pour récupérer les données de la pages 1 et les lister correctement.

Mon problème c'est que quand je dois supprimer des lignes vides dans Feuil1 qui font partie de la plage C6:C15, la formule en Feuil2 se met à jour ex: {=CONCATENER(ListeTriée('Feuil1'!C6:C10)} sur les dernières lignes de la matrice s'affiche #N/A

Je comprends tout à fait pourquoi se #N/A apparait mais je n'arrive pas à le cacher, j'ai essayé d'ajouter un si(estna()) à ma formule matricielle mais cela n'a rien changé

Est-il donc vraiment possible de cacher ses #N/A et si oui comment?


En vous remerciant d'avance.
 

Discussions similaires