Excel 显示表列中每个唯一值的计数

Excel 显示表列中每个唯一值的计数,excel,excel-formula,listobject,vba,Excel,Excel Formula,Listobject,Vba,如何从表的列中获取每个唯一值的计数,加上实际值,并将其放入另一个单元格中 表1的状态栏 **status** ------ itemA itemA itemB itemC 将所需结果放入单个单元格: Table 1 Status summary |2 itemA, 1 itemB, 1 itemC 我愿意接受一个简单的逗号分隔的列表,其中包含所有不同的值,而不包含计数 背景资料: 我有一个excel文档,用于跟踪新应用程序的验收测试。该文档包含多个工作表(每个工作表表示需要测试的代码

如何从表的列中获取每个唯一值的计数,加上实际值,并将其放入另一个单元格中

表1的状态栏

**status**  
------  
itemA
itemA
itemB
itemC
将所需结果放入单个单元格:

Table 1 Status summary |2 itemA, 1 itemB, 1 itemC
我愿意接受一个简单的逗号分隔的列表,其中包含所有不同的值,而不包含计数

背景资料: 我有一个excel文档,用于跟踪新应用程序的验收测试。该文档包含多个工作表(每个工作表表示需要测试的代码区域),每个工作表具有多个表(表示测试用例,其中每个用例应进行多次测试或以不同方式进行测试等),然后有一个摘要工作表,其中我需要数据的快照。在摘要页面上,每个工作表中的每个表都有一行和一个状态列。在该状态列中,我想显示在相应表中选择的每个状态的计数。我最初创建了一个很长的公式,如果计数大于0,则对值及其计数进行硬编码,但在我们进行测试时,我们发现需要添加新的状态值,然后公式会变得很麻烦,无法保持更新

编辑:添加公式 这是我最初的公式

=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"," ")

问题是,该公式在摘要页面上重复了大约100次(对基础工作表中的每个表重复一次),每次我想添加状态时,我都需要编辑每个公式。

如果您的单元格位于
A1:A4
,请将此数组公式放入单元格
B1:B4

{=$A$1:$A$4&": "&COUNTIF($A$1:$A$4,$A$1:$A$4)}
这将创建类似于
itemA:2
itemB:1
的字符串,但会有重复

然后,使用您在注释中建议的VBA代码。为了完整起见,我把它放在这里:

Function ConcatUniq(ByRef rng As Range) As String
    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

此VBA解决方案使用用户定义的函数,该函数:

.-验证
目标范围
属于
列表对象
(Excel表格)

.-使用
数组
保存表中的所有状态值

.-使用
控件
字符串验证唯一性状态

.-使用
输出
字符串保存具有相应计数的唯一状态列表

注意:列表的顺序与它们在表中的显示顺序相同。排序不在问题的范围内,但如果您希望对其进行排序,我建议根据需要对
ListObject
进行排序(不包括在内)

尝试以下步骤(请参阅代码中的注释):

建议阅读以下页面,以便更深入地了解所使用的资源:

,, , ,

,,
.

re:“我最初创建了一个很长的公式,对值进行了硬编码,…”我没有看到一个公式。我想去掉这个公式,所以我之前没有发布过,编辑后包含了公式。感谢您的回复,分解这个问题似乎是合乎逻辑的,但不是很容易扩展的。现在文档中大约有100个表,我需要为每个表执行此操作。另外,添加新表所需的步骤太多也不太理想。VBA解决方案可以吗?我们可以使用my Count的数组版本来解决一些问题。如果答案为,用于连接数组中的唯一值,VBA就可以了。实际上,我一直在努力实现自己的解决方案,但我必须承认,由于我的编程知识,我可以阅读VBA,但我完全不知道如何编写它。我能够让它创建一个逗号分隔的唯一值列表,但不能对它们进行计数。
函数ConcatUniq(ByRef rng As Range)作为字符串Dim r作为Range Static dic As Object如果dic为空,则uuu设置dic=CreateObject(“Scripting.Dictionary”)对于rng中的每个r,如果r.Value为空,则dic(r.Value)=如果Next ConcatUniq=Join$(dic.keys,“,”)则为空结束dic.RemoveAll End函数
抱歉,我不知道如何在此处格式化!好吧,我完全改变了我的答案。我把你的(格式化的)VBA代码作为我答案的一部分
=ConcatUniq(B1:B4)
Private Function Lob_Status_Count(rTrg As Range) As String
Const kStt As String = "Status"
Dim lob As ListObject
Dim sControl As String, sOutput As String
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, ", ", vbNullString, 1, 1)

    End With

    Rem Set Results
    Lob_Status_Count = sOutput

Exit Function
ExitTkn:
    Lob_Status_Count = "!Err ListObject"

End Function