Compter les noms différent

Fermé
Mrgeek - 1 mai 2014 à 20:16
Mike-31 Messages postés 18335 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 septembre 2024 - 2 mai 2014 à 21:03
Bonjour,


je voudrai trouver une formule qui me permet de compter le nombre de noms différent dans différente ligne (par exemple compter les noms différent dans les ligne A1;G1 et A5;G5)
j'ai trouver cette formule: =SOMMEPROD((A1:A10<>"")/NB.SI(A1:A10;A1:A10&"")) sauf que elle me permet de compter que dans une seul ligne ou colonne .

quelqu'un peut m'aider????

6 réponses

Mike-31 Messages postés 18335 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 septembre 2024 5 095
1 mai 2014 à 22:33
Bonsoir,

il s'agit d'une formule matricielle, pour compter les valeurs entre A1 et G1 la formule est

=SOMME(SI(A1:G1<>"";1/NB.SI(A1:G1;A1:G1)))

mais cette formule doit être validée en cliquant en même temps sur les trois touche Ctrl, Shift et Entrée si tu fais bien le formule se placera entre {}
comme ceci
{=SOMME(SI(A1:G1<>"";1/NB.SI(A1:G1;A1:G1)))}

et pour compter les valeurs de A1 à G1 et de A5 à G5
=SOMME(SI(A1:G1<>"";1/NB.SI(A1:G1;A1:G1)))+SOMME(SI(A5:G5<>"";1/NB.SI(A5:G5;A5:G5)))

et valider la formule en matricielle
0
le problème avec cette formule c'est que sa compte les noms différent dans chaque ligne indépendamment, et additionne tout les résulta pour donner le nombre totale pour tout les ligne, et que du coup si un même nom apparaît dans plusieurs ligne différente il sera comptabiliser plusieurs fois.
0
Mike-31 Messages postés 18335 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 septembre 2024 5 095
2 mai 2014 à 08:35
Re,

l'idéal serait d'avoir une plage de cellules contigües ce qui donnerait

=SOMME(SI(A1:G5<>"";1/NB.SI(A1:G5;A1:G5))) toujours en matricielle, je regarde s'il est possible de contourner le problème
0
Mike-31 Messages postés 18335 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 septembre 2024 5 095
Modifié par Mike-31 le 2/05/2014 à 10:10
Re,

Les cellules non contiguës posent un réel problème pour ce genre de calcul, le plus simple serait le traitement par VBA et encore que ?

le plus simple serait de regrouper tes données sur deux lignes contigües ou mieux deux colonnes pour gagner en place. et là plusieurs possibilités soit tu fais un copier/Collage spécial et transposer chaque ligne pour les avoir en colonne
ou on automatise l'ensemble

par exemple si tu as les colonnes L et M vide, en L1 tu peux coller cette formule

=INDIRECT(CAR(COLONNE()+64-11+LIGNE()-1)&1)
explication CAR(COLONNE()+64 te donne l'index colonne active soit L pour avoir A soit tu mets -11 soit tu changes 64-11 ce qui fera CAR(COLONNE()+53
+LIGNE()-1) cette partie te donnera l'index ligne et s'ajoutera à l'index colonne A pour obtenir dans la formule B à la ligne suivante puis C etc ... et &1 est le numéro ligne

en M1 tu colles la même formule adaptée soit =INDIRECT(CAR(COLONNE()+64-12+LIGNE()-1)&5)
ou
=INDIRECT(CAR(COLONNE()+52+LIGNE()-1)&5)

tu prends les deux cellule L1 et M1 et tu incrémentes vers le bas

ensuite tu reprends ma formule matricielle en modifiant le >1 par >0 pour ne pas compter les zéros résultant de la formule

=SOMME(SI(L1:M19>0;1/NB.SI(L1:M19;L1:M19)))

les colonnes L et M peuvent être masquées et si tu as besoin d'un montage fait signe
A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
via55 Messages postés 14473 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 13 septembre 2024 2 728
2 mai 2014 à 13:30
Bonjour Mrgeek, bonjour Mike,

Traitement possible par VBA pour 2 plages horizontales (qui peuvent être de longueur différentes) :

Sub comptage()
c1 = UCase(InputBox("Indiquer lettre 1ere colonne de la 1ere plage"))
c2 = UCase(InputBox("Indiquer lettre dernière colonne de la 1ere plage"))
l1 = InputBox("Indiquer la ligne de la 1ere plage")
c3 = UCase(InputBox("Indiquer lettre 1ere colonne de la 2eme plage"))
c4 = UCase(InputBox("Indiquer lettre dernière colonne de la 2eme plage"))
l2 = InputBox("Indiquer la ligne de la 2eme plage ")

x = Asc(c2) - Asc(c1) + 1 'nbre de colonnes 1ere plage
Z = Asc(c4) - Asc(c3) + 1 'nbre de colonne 2eme plage

For n = 1 To x ' boucle sur les x colonnes de la 1ere plage
'A= 1/nbre de fois ou la valeur est répétée 1ere plage + nbre de fois où la valeur est présente en plage 2
' ex : une valeur répétée 3 fois en plage 1 et présente 2 fois en ligne 2 se verra attribuer le poids de 1/5 ou 0,2
A = 1 / (Application.WorksheetFunction.CountIf(Range(c1 & l1 & ":" & c2 & l1), Cells(l1, n)) + Application.WorksheetFunction.CountIf(Range(c3 & l2 & ":" & c4 & l2), Cells(l1, n)))
tot1 = tot1 + A 'additionne les poids des valeurs
Next

For n = 1 To Z ' boucle sur les Z colonnes de la 2eme plage
' même calcul que precedement mais inversé
A = 1 / (Application.WorksheetFunction.CountIf(Range(c3 & l2 & ":" & c4 & l2), Cells(l2, n)) + Application.WorksheetFunction.CountIf(Range(c1 & l1 & ":" & c2 & l1), Cells(l2, n)))
tot2 = tot2 + A
Next

tot3 = tot1 + tot2

MsgBox ("Noms différents : " & tot3)


End Sub

Cdlmnt
0

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

Posez votre question
j'ai pas tout compris Mike-31 mais voila se que j'ai fait:


je prend d'autre ligne contigu du genre J1;P1 et J2;P2 ensuite je fait afficher dans la ligne J1;P1 les noms présent en A1;G1 et dans la ligne J2;P2 les noms présent en A5;G5, puis j'applique la formule du début; =SOMMEPROD((J1;P2<>"")/NB.SI(J1;P2;J1;P2&"")) dans la zone J1;P2. et le tour est jouer !!!!
0
Mike-31 Messages postés 18335 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 septembre 2024 5 095
2 mai 2014 à 21:03
Re,

Reprends mes explication avec le fichier joint tu devrais avancer, en cellule J3 le nombre d'occurrences

https://www.cjoint.com/?DEcvcVCAm6G
0