Afficher un count pour chaque valeur unique dans une colonne de table

Comment puis-je saisir un count de chaque valeur unique à partir d'une colonne de table, plus la valeur réelle, dans une autre cellule.

Colonne d'état du tableau 1

**status** ------ itemA itemA itemB itemC 

résultats souhaités dans une seule cellule:

 Table 1 Status summary |2 itemA, 1 itemB, 1 itemC 

Je me contenterais d'une simple list séparée par des virgules de toutes les valeurs distinctes sans countr.

INFORMATIONS GÉNÉRALES: J'ai un document excel que nous utilisons pour suivre les tests d'acceptation d'une nouvelle application. Le document qui détient plusieurs feuilles de travail (chacune représentant une zone de code qui doit être testé) et chaque feuille de calcul a plusieurs tables (qui représentent des cas de test où chaque cas doit être testé à plusieurs resockets ou de différentes manières, etc.), puis il existe un fiche de synthèse où je souhaite un instantané des données. Sur la page récapitulative, il existe une ligne pour chaque table dans chaque feuille de calcul et une colonne d'état. Dans cette colonne d'état, je souhaite afficher un count de chaque statut sélectionné dans la table correspondante. J'avais créé à l'origine une longue formule qui codait dur les valeurs et leurs counts si le nombre était> 0, mais comme nous testons, nous trouvons la nécessité d'append de nouvelles valeurs d'état et la formule devient difficile à mettre à jour.

EDIT: ADDING FORMULA Voici la formule que j'avais à l'origine là-bas

 =IF(COUNTIF(Table1[Status],"itemA"),COUNTIF(Table1[Status],"itemA")&" itemA"," ") & IF(COUNTIF(Table1[Status],"itemB"), ", " &COUNTIF(Table1[Status],"itemB")&" itemB"," ") & IF(COUNTIF(Table1[Status],"itemC"), ", " &COUNTIF(Table1[Status],"itemC")&" itemC"," ") 

Le problème est que la formule a été répétée environ 100 fois sur la page récapitulative (une fois pour chaque table dans les feuilles de travail sous-jacentes) et chaque fois que je voulais append un état, je devrais modifier chacune des formules.

Si vos cellules sont en A1:A4 , placez cette formule de tableau dans les cellules B1:B4 :

 {=$A$1:$A$4&": "&COUNTIF($A$1:$A$4,$A$1:$A$4)} 

Cela créera vos strings qui ressemblent à itemA: 2 et itemB: 1 , mais il y aura des répétitions.

Ensuite, vous utiliserez le code VBA que vous avez suggéré dans les commentaires. Je le pose ici dans un souci d'exhaustivité:

 Function ConcatUniq(ByRef rng As Range) As Ssortingng Dim r As Range Static dic As Object If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary") For Each r In rng If r.Value <> Empty Then dic(r.Value) = Empty End If Next ConcatUniq = Join$(dic.keys, ", ") dic.RemoveAll End Function 

Ainsi, la formule de votre dernière string de cellules ressemblera à ceci:

 =ConcatUniq(B1:B4) 

Cette solution VBA utilise une fonction définie par l'user qui:

.- Valide la Target Range appartient à un ListObject (table Excel) .

.- Utilise une Array pour contenir toutes les valeurs d'état de la table.

.- Utilise une string de Control pour valider l'état de singularité.

.- Utilise une string de Output pour contenir la list d'état unique avec le count correspondant.

Remarque: la list aura le même ordre que celui figurant dans le tableau. Le sorting n'est pas sur la scope de la question, mais si vous le souhaitez, je suggère de sortinger le ListObject comme requirejs (non inclus).

Essayez cette procédure (voir les commentaires inclus dans le code) :

 Private Function Lob_Status_Count(rTrg As Range) As Ssortingng Const kStt As Ssortingng = "Status" Dim lob As ListObject Dim sControl As Ssortingng, sOutput As Ssortingng Dim aStt As Variant, vStt As Variant, bStt As Byte Rem Validate Input On Error Resume Next Set lob = rTrg.ListObject 'Set ListObject On Error GoTo 0 If lob Is Nothing Then GoTo ExitTkn 'Exit if Target range is not a ListObject With lob.ListColumns(kStt).DataBodyRange Rem Set Status Array aStt = WorksheetFunction.Transpose(.Value2) Rem Set Status Output For Each vStt In aStt If InStr(sControl, Chr(167) & vStt & Chr(167)) = 0 Then 'Validates uniqueness bStt = WorksheetFunction.CountIf(.Cells, vStt) 'Gets Status Count sOutput = sOutput & ", " & bStt & " " & vStt 'Adds to Results sControl = sControl & Chr(167) & vStt & Chr(167) 'Adds to Control End If: Next Rem Cleanup Output sOutput = Replace(sOutput, ", ", vbNullSsortingng, 1, 1) End With Rem Set Results Lob_Status_Count = sOutput Exit Function ExitTkn: Lob_Status_Count = "!Err ListObject" End Function 

Suggérez à lire les pages suivantes pour mieux comprendre les ressources utilisées:

Utilisation de arrays , ListObject Members (Excel) , WorksheetFunction Object (Excel) ,

Pour chaque … Next Statement , InStr Function , On Error Statement .