比较和计数值

Comparing and counting values

我有一个 table,我们称它为我的 Individuals Table,很像下面的那个,包含一列个人及其对应的相邻单元格中列出的代码。每个人的代码都列在个人姓名旁边的同一个相邻单元格中,并用回车分隔 return.

Example table

我想做的是:

Result of running the algorithm on the example table

如果类似的程序可以达到相同的结果,那么我也愿意。

我尝试通过尽量减少使用 VBA 代码来为您提供一个可能的解决方案。

作为起点,我会为每个人重新排列代码。在由 return 分隔的单个单元格中保留更多代码,这不像每个单元格都有一个代码那样易于管理。当然,我会将每个代码与每个人相关联。一种方法是使用您的数据,使用公式替换并将 returns 字符替换为分号。公式是这样工作的:

=SUBSTITUTE(B2,CHAR(13),CHAR(59))

B2 是您要将 returns 转换为分号的单元格。然后,您将对 B 列中的所有值使用此公式。

将 returns 替换为分号后,复制并粘贴值,然后在“数据”选项卡中使用 "Text to Columns" 函数,您会将每个单元格转换为一系列列(取决于列的数量您在 sheet 的原始单元格中列出的代码)。现在您将处于这样一种情况,第一列是个人姓名,然后在后续列的同一行中您有所有相关代码,如下图所示:

为了创建所有代码的完整列表,您可以轻松复制所有包含代码的列。将代码粘贴到 suitable space 中(我建议在新作品中sheet),然后通过一些复制和粘贴作业将所有代码放在同一列下。 Select 所有代码和按钮 "Remove Duplicates" 始终位于“数据”选项卡中,您将获得原始 table.

中包含的所有唯一代码的列表

然后您可以复制并粘贴包含您在 "Codes" 列下创建的所有唯一代码的列。现在您可以使用以下公式计算转换后的 table 中的代码:

=COUNTIF($B:$C, D2)

其中 COUNTIF 的第一个参数指的是转换后的 table 中的代码,第二个参数是您粘贴唯一代码的列 "Codes" 中的代码。

据我所知,Excel 中没有创建以逗号分隔的名称列表的功能(但如果有人知道,我会很高兴发现它存在!!!)。因此,我用一些 VBA 代码创建了一个自定义的,名称为 List Individuals:

Function ListIndividuals(refCode, NameRange As Range, CodesRange As Range) As String
'Check size in row number of NameRange and CodesRange is same, otherwise give error
If NameRange.Rows.Count <> CodesRange.Rows.Count Then
    ListIndividuals = CVErr(xlErrRef)
    Exit Function
End If

result = ""

For Col = 1 To CodesRange.Columns.Count
    For n = 1 To CodesRange.Rows.Count
        If CodesRange.Cells(n, Col).Value = refCode Then
            If CodesRange.Cells(n, Col).Value <> "" Then
                If result = "" Then
                    result = NameRange(n)
                Else
                    result = result & ", " & NameRange(n)
                End If
            End If
        End If
    Next
Next

ListIndividuals = result

End Function

最后一步是在 "Individuals" 单元格下使用此公式,如下所示:

=ListIndividuals(D2,$A:$A,$D:$E)

其中第一个参数是代码,第二个参数是转换后的个体列表table(应该是第一列),然后第三个参数是转换后的代码列table。作为此自定义公式的结果,您将获得用逗号分隔的个人列表。

以上所有内容均适用于我的电脑,但如果您需要更多信息,请随时与我联系。