【问题标题】:Comparing and counting values比较和计数值
【发布时间】:2016-03-02 14:39:29
【问题描述】:

我有一张表格,我们称之为个人表格,很像下面的表格,其中包含一列个人以及他们在相邻单元格中列出的相应代码。每个人的代码都列在个人姓名旁边的同一相邻单元格中,并用回车分隔。

Example table

我想做的是:

  • 遍历每个人的代码单元

  • 对于个人代码单元格中的每个代码,检查此代码是否存在于单独的代码表

  • 如果代码存在于 代码表 中,则将 n+1 添加到相邻单元格中该代码的总数中,并将个人姓名添加到具有相同代码的个人列表中另一个相邻单元格中的代码。

  • 如果代码不存在于 代码表 中,请将代码添加到 代码表,将 n+1 添加到该代码的总数中在相邻单元格中,并将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。

Result of running the algorithm on the example table

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

【问题讨论】:

    标签: excel compare counting


    【解决方案1】:

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

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

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

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

    用分号替换返回值后,复制和粘贴值,然后使用“数据”选项卡中的“文本到列”功能,您会将每个单元格转换为一系列列(取决于您在原始列表中列出了多少代码工作表的单元格)。现在您将处于这样一种情况,第一列您有个人姓名,然后在后续列的同一行中您有所有相关代码,如下图所示:

    为了创建所有代码的完整列表,您可以轻松地复制所有包含代码的列。将代码粘贴到合适的空间(我建议在新工作表中),然后通过一些复制和粘贴作业将所有代码放在同一列下。选择所有代码,然后始终使用“数据”选项卡中的“删除重复项”按钮,您将获得原始表格中包含的所有唯一代码的列表。

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

    =COUNTIF($B$1:$C$4, D2)
    

    其中 COUNTIF 的第一个参数是指转换表中的代码,第二个参数是您粘贴唯一代码的“代码”列中的代码。

    现在据我所知,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
    

    所以最后一步是在“个人”单元格下使用此公式,如下所示:

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

    第一个参数是代码,第二个是转换表中的个人列表(应该是第一列),然后第三个是转换表中带有代码的列。由于使用此自定义公式,您将获得以逗号分隔的个人列表。

    以上所有内容都可以在我的电脑上运行,但如果您需要更多信息,请随时与我联系。

    【讨论】:

    • 优秀的解决方案和过程解释!谢谢你。只是一件小事——下面的 CHAR 代码可以用新行代替分号:=SUBSTITUTE(B4,CHAR(10),CHAR(45)) 除此之外,一切都很顺利。
    • 我相信CHAR代码的不同可能是因为我使用的是Mac,而您可能使用的是Windows。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2016-04-07
    • 2011-02-10
    • 2020-10-03
    • 2022-11-10
    相关资源
    最近更新 更多