0

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

表一的状态栏

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

将所需结果放入单个单元格中:

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

我会满足于一个简单的逗号分隔的所有不同值的列表,而不需要计数。

背景信息:我有一个 Excel 文档,用于跟踪新应用程序的验收测试。该文档包含多个工作表(每个工作表代表需要测试的代码区域)并且每个工作表都有多个表(代表每个案例应该多次或以不同方式测试的测试用例等),然后有一个我想要数据快照的摘要工作表。在摘要页面上,每个工作表中的每个表都有一行和一个状态列。在该状态列中,我想显示在相应表中选择的每个状态的计数。我最初创建了一个冗长的公式,如果 count > 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 次(基础工作表中的每个表一次),每次我想添加状态时,我都需要编辑每个公式。

4

2 回答 2

0

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

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

这将创建看起来像itemA: 2and的字符串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

所以你的最终字符串的单元格公式将如下所示:

=ConcatUniq(B1:B4)
于 2017-03-30T23:02:12.920 回答
0

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

.- 验证Target Range属于ListObject (Excel 表)

.- 使用 anArray保存表中的所有状态值。

.- 使用Control字符串来验证唯一性状态。

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

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

试试这个过程(见代码中包含的注释)

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

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

使用数组ListObject 成员 (Excel)WorksheetFunction 对象 (Excel)

For Each...Next 语句InStr 函数On 错误语句

于 2017-03-31T20:33:21.637 回答