Compter occurences dans une colonne

Bonjour à tous,

J’ai une grande liste de données dans la colonne "F".

En partant de ces données qui se trouvent dans cette colonne "F", on va créer une liste sans doublons qu’on placera dans la colonne "Q", à partir de la cellule "Q2", puis on va compter le nombre de chaque élément dans la colonne "Q" dans la colonne "F" pour indiquer ce comptage d’occurrence dans la colonne "R".

J’ai mis un petit exemple dans mon fichier, ce dernier contient très peu de données par rapport aux données réelles, c’est pour cela que je me permets de vous demander un Marco en vba qui utilise un tableau du genre LBound(arr, 1) To UBound(arr, 1) combiné peut-être à un dictionnary pour rendre l’exécution assez rapide.

Deux petits détails à vous signaler, prévoir les en-têtes dans les colonnes "Q" et "R" et ne pas trier la colonne "F" pour garder les données telles quelles.

Bonne programmation et au plaisir de vous lire.

Salutations.

Bonjour,

Quand vous parlez de beaucoup de données, nous parlons de quoi ?

1 000, 10 000, 1 000 000 d'enregistrements ?

Pourquoi ne pas utiliser les fonctions UNIQUE en colonne Q et NB.SI en colonne R avec la propagation des formules ?

Ou encore un TCD qui remplie parfaitement ce rôle.

Ou encore en PowerQuery, bref de multiples possibilités s'offrent à vous.

Bonjour à tous !

Si le passage par VBA n'est pas une contrainte indépassable, une requête Power Query, très basique, retourne rapidement le résultat attendu :

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    GroupBy = Table.Group(Source, {"Mâles"}, {{"Occurences", each Table.RowCount(_), Int64.Type}})
in
    GroupBy
image

Note : Un tableau structuré (tSource) a été inséré en colonne F.

Bonjour à tous de nouveau !

Pourquoi ne pas utiliser les fonctions UNIQUE en colonne Q et NB.SI en colonne R avec la propagation des formules ?

Peut-être parce que la fonction UNIQUE n'est pas disponible dans Excel 2016 ?

Bonjour à tous de nouveau !

Pourquoi ne pas utiliser les fonctions UNIQUE en colonne Q et NB.SI en colonne R avec la propagation des formules ?

Peut-être parce que la fonction UNIQUE n'est pas disponible dans Excel 2016 ?

C'est effectivement une bonne raison. ;-)

Bonjour à tous,

Si le nombre de données est important, une requete PQ comme la solution de JFL est plus appropriée.

Bonjour Harzer, bonjour à tous,

Comme demandé, une solution par macro.

Un petit bouton 'Clic !' fait le boulot. À tester.

Bonne journée à tous !

Cordialement.

AL 22

Bonjour jpbt84, saboh12617 et JFL,

Merci pour vos retours.

Mes connaissances dans les requêtes sont limitées, pourriez-vous mettre la requête de JFL en application dans le fichier joint à ma demande, ainsi, je peux visualiser et mieux comprendre l'utilisation de la requête.

Merci d’avance.

Bonjour à tous de nouveau !

Et hop.....

Si je peux me permettre de compléter la proposition de JFL.

Étape 1 : Transformer votre table de données en tableau de données structuré (Insertion/Tableaux/Tableau)

Étape 2 : Nommer votre nouveau tableau (optionnel, mais idéal) (Sélectionner une cellule du tableau, puis Création de tableau/Propriétés/Nom du tableau)

Étape 3 : Ouvrir PowerQuery avec les données du tableau (Sélectionner une cellule du tableau, puis Données/Récupérer et transformer des données/à partir de Tableau ou d'une plage)

Étape 4 : Cliquez sur Accueil/Requête/Éditeur avancé

Étape 5 : Coller la requête proposée par JFL

let

Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],

GroupBy = Table.Group(Source, {"Mâles"}, {{"Occurences", each Table.RowCount(_), Int64.Type}})

in

GroupBy

Ligne : Excel.CurrentWorkbook(){[Name="tSource"]}[Content],

Indique que vous allez utiliser le contenu de cette source de données, avec Name, correspondant au nom de votre tableau structuré.

Ligne : GroupBy = Table.Group(Source, {"Mâles"}, {{"Occurences", each Table.RowCount(_), Int64.Type}})

Indique que vous souhaitez grouper les données de la source, à partir de la colonne « Mâles » et compter le nombre de valeurs identiques, puis retourner les valeurs uniques et un nombre entier correspondant au nombre de valeurs.

Enfin, in GroupBy retourne le résultat dans une matrice.

Étape 6 : Pour récupérer les données dans votre feuille (Accueil/Fermer et charger/Fermer et charger dans)

Étape 7 : Sélectionner Insérer les données dans : Feuille de calcul existante et cliquez sur la première cellule recevant le résultat, ici, c’est la cellule Q1.

Bonjour jpbt84, JFL, saboh12617 et AL 22,

Grand Merci pour vos contributions, disponibilités et vos Conseils.

Merci à jpbt84 d'avoir pris la peine de m'expliquer comment pouvoir le faire moi-même, je vous avoue que ça n'a pas été facile de mettre en application vos suggestions, je penses que cela est dû au fait que nous n’avons pas la même version d'Excel.

Merci à JFL d'avoir mis sa solution en application dans le fichier directement, je vais décortiquer comment vous l'avez construit.

Merci à saboh12617 pour ses conseils avisés.

Et enfin, merci à AL 22 pour sa solution en vba, je l’ai testé, elle fonctionne très bien et donne le bon résultat souhaité.

Bonne soirée à tous et au plaisir de vos lire.

Salutations.

Bonsoir à tous !

Je vous remercie de ce retour.

Excellentes investigations ...!

Bonsoir à tous,

En passant par ici, j'ai remarqué que la proposition de jpbt84 concernant la mise en place d'un TCD n'a pas encore été mise en œuvre !

Etant un grand fan des TCD, JB_ s'est empressé de saisir l'occasion pour présenter le résultat Et en prime, les mâles sont triés par ordre alphabétique (j'espère que ce n'était pas une exigence).

Bonne soirée !

Bonsoir à tous ,

Sinon classiquement, on peut utiliser le code suivant :

Sub CompterUniques()
 With Sheets("Feuil1")
   .Range("q:r").ClearContents: .Range("r1") = "Occurrences"
   .Range("f1:f" & .Cells(Rows.Count, "f").End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("q1"), Unique:=True
   .Range("r2").Formula = "=COUNTIF(f:f,q2)"
   .Range("r2").AutoFill Destination:=.Range(.Range("r2"), .Range("q2").End(xlDown).Offset(, 1))
 End With
End Sub

Re,

S'il y a beaucoup de lignes, une méthode VBA plus rapide. Environ 5,6 s pour 1 000 000 lignes de données et 100 000 valeurs différentes.

Sub CompterUniquesTri()
Dim der&, t0, t, n&, som&, i&, ref, deb
With Sheets("Feuil1")
   deb = Timer
   Application.ScreenUpdating = False
   der = .Cells(Rows.Count, "f").End(xlUp).Row
   t0 = .Range("f1").Resize(der)
   .Range("f1").Resize(der).Sort key1:=.Range("f1"), order1:=xlAscending, Header:=xlYes, MatchCase:=False
   t = .Range("f1").Resize(der + 1)
   ReDim Preserve t(1 To UBound(t), 1 To 2)
   .Range("f1").Resize(der) = t0
   ref = t(1, 1): n = 0: som = 1
   For i = 2 To UBound(t)
      If t(i, 1) = ref Then
         som = som + 1
      Else
         n = n + 1: t(n, 1) = ref: t(n, 2) = som
         ref = t(i, 1): som = 1
      End If
   Next i
   t(1, 2) = "Occurrences"
   Range("q:r").ClearContents
   Range("q1").Resize(n, 2) = t
 End With
 MsgBox "Durée = " & Format(Timer - deb, "#,##0.0\ sec.")
End Sub

Bonjour JB et mafraise,

Merci à vous JB pour votre proposition, j’ai une petite question pour vous, à savoir, comment mettre l’En-tête dans la cellule "T1" et lui donner le nom de : "Mâles d’Elevage".

Merci également à mafraise pour vos deux propositions, les deux fonctionnent très bien et me donne le bon résultat.

À ce sujet, j’ai fait mes tests sur la rapidité des deux propositions (sur un total de 300000 lignes de données), j’étais surpris que la proposition avec les formules (en colonne "R") était plus rapide que la proposition qui utilise le tableau, Certes, la différence est minime mais elle est là comme même : 0,5 secondes pour celle qui utilise les formules en colonne "R" et 3,2 secondes pour celle qui utilise le tableau, comment expliquez-vous cela ?

Je suis content que j’ai trouvé grâce à vous tous une solution à mon problème, avec des propositions aussi bonnes et variées.

Merci à tous les intervenants.

Bonjour à tous,

@Harzer : Tu cliques n'importe où sur le TCD. Tu vas dans l'onglet "Analyse du tableau croisé dynamique". Ensuite, tout à droite tu sélectionnes "En-têtes de champ" et tu modifies la cellule T1 comme tu le souhaites...

Tu ne voyais rien car j'avais désélectionné "En-têtes de champ". Par défaut, il est affiché "Étiquettes de lignes".

Bonjour JB,

Merci pour votre retour et les explications qui se trouvent dans votre message.

Voilà c’est fait, je ne l’aurais jamais trouvé sans vos explications.

Salutations.

Rechercher des sujets similaires à "compter occurences colonne"