Lister et compter le nombre d'occurrences avec plusieurs valeurs par cellule

pierrrot

XLDnaute Nouveau
Bonjour,

J'ai un tableau qui liste dans une seule colonne la ou les productions agricoles de différentes fermes, sur ce modèle :
Ferme 1 - Caprins
Ferme 2 - Maraichage
Ferme 3 - Arboriculture;Maraichage
Ferme 4 - Bovin lait;Caprins;Maraichage;Ovins lait

J'aimerais lister sans doublon les différentes productions et compter le nombre d'occurrences de chacune (sachant, si ça peut aider, qu'il n'y a qu'une occurrence possible par cellule : "Caprins" n'apparaît jamais plus d'une fois dans une cellule).

Je joins un exemple.
Merci beaucoup à celles et ceux qui se pencheront sur mon problème !
Bonne journée
Pierrrot
 

Pièces jointes

  • exemple.xls
    17.5 KB · Affichages: 92

pierrrot

XLDnaute Nouveau
Bonjour Marcílio,

Merci beaucoup pour votre réponse si rapide, depuis le Brésil ! C'est exactement ce que je voulais pour compter le nombre d'occurrences. Mais auriez-vous une solution pour lister sans doublon les différents types de production, c'est-à-dire pour obtenir automatiquement la colonne C "Activité" du tableau ?

Bonne journée en tout cas.
Pierrot
 

CISCO

XLDnaute Barbatruc
Bonjour

Une possibilité avec une méthode proposée par david84 là :
https://www.excel-downloads.com/threads/liste-triée-par-ordre-alpha-extraite-dun-tableau.147738/#post-881423

Il faut d'abord distribuer les données sur plusieurs colonnes. Cela peut être fait rapidement en sélectionnant la plage A3:A6, puis --> Données --> Convertir -->Délimité --> Point-virgule-->Terminé.

Il faut ensuite sélectionner toute la plage contenant les diverses données, ici A3: D6. Définir le nom zone dans le gestionnaire de noms. Puis coller à droite de A3: D6, dans F2 par ex, la formule,
Code:
SI(LIGNES($1:1)<=SOMME(SI(Zone<>"";1/NB.SI(Zone;Zone)));INDIRECT(ADRESSE(MOD(MIN(SI((Zone<>"")*(NB.SI(F$1:F1;Zone)=0);NB.SI(Zone;"<"&Zone)*10^5+LIGNE(Zone)));10^5);MOD(MOD(MIN(SI((Zone<>"")*(NB.SI(F$1:F1;Zone)=0);NB.SI(Zone;"<"&Zone)*10^5+LIGNE(Zone)*10^2+COLONNE(Zone)));10^5);10^2)));"")
la valider en matriciel avec Ctrl+maj+entrer, et la tirer vers le bas aussi longtemps que désiré.
Cette formule donne la liste des noms dans l'ordre alphabétique. Il y a d'autres propositions dans le fil de david84 cité ci-dessus.

Mettre dans G2 la formule =NB.SI(Zone;F2) et la tirer vers le bas.

@ plus
 

Pièces jointes

  • exemple ferme.xls
    27 KB · Affichages: 93

job75

XLDnaute Barbatruc
Bonsoir à tous,

En VBA c'est un problème très classique qui se règle facilement avec le Dictionary :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim source As Range, dest As Range, sep$, d As Object, t, i&, s, j%, x$
Set source = [A3] '1ère cellule de la liste source, à adapter
Set dest = [C4] '1ère cellule de destination, à adapter
sep = ";" 'séparateur, à adapter
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
dest.Resize(Rows.Count - dest.Row + 1, 2) = "" 'RAZ
'---analyse de la liste sans doublon---
With Range(source, Cells(Rows.Count, source.Column).End(xlUp))
  If .Row >= source.Row Then
    t = .Resize(, 2) 'au moins 2 éléments
    For i = 1 To UBound(t)
      s = Split(CStr(t(i, 1)), sep)
      For j = 0 To UBound(s)
        x = Trim(s(j))
        d(x) = d(x) + 1 'comptage
    Next j, i
  End If
End With
'---restitution---
If d.Count Then
  dest.Resize(d.Count) = Application.Transpose(d.keys) 'maximum 65536 lignes
  dest(1, 2).Resize(d.Count) = Application.Transpose(d.items)
  dest.Resize(d.Count, 2).Sort dest, xlAscending, Header:=xlNo 'tri alphabétique
End If
Application.EnableEvents = True 'réactive les évènements
End Sub
L'exécution est très rapide c'est pourquoi on peut mettre le code dans une Worksheet_Change.

Fichier joint.

A+
 

Pièces jointes

  • exemple(1).xls
    37 KB · Affichages: 87
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonsoir

Pour le fun (la solution de Job75 et celle de David84 conviennent très bien), une autre possibilité, un peu plus simple, ne mettant pas dans l'ordre alphabétique les noms. Si la plage zone dépasse la colonne CU, il faudra remplacer les 100 dans la formule par une valeur plus grande, 1000 par exemple.

@ plus
 

Pièces jointes

  • exemple fermebis.xls
    20.5 KB · Affichages: 71
Dernière édition:

Statistiques des forums

Discussions
312 106
Messages
2 085 352
Membres
102 871
dernier inscrit
Maïmanko