2015-11-28 106 views
0

我有一个表,我们将其称为我的个人表,非常类似于下面的表,其中包含一列个人以及相邻单元格中列出的相应代码。每个人的代码都列在个人姓名旁边的同一个相邻单元格内,并由回车分隔。比较和计算值

Example table
Example table

我希望做的是以下几点:通过为每个

  • 代码单元对于个人的代码每个代码

    • 运行请检查此代码是否存在于单独的代码表中

    • 如果代码表存在的代码,在相邻小区中添加的n + 1到总计数为代码,并添加个人的姓名,以与另一个相邻小区相同的码的个人的列表。

    • 如果代码不存在于代码表存在,添加代码到代码表,在相邻小区中添加的n + 1到总计数为代码,并添加个人的名字到在另一个相邻单元中具有相同代码的个人列表。

    Result of running the algorithm on the example table Result of running the algorithm on the example table

    如果类似的程序可以达到同样的效果,然后我打开即得。

  • 回答

    0

    我试着给你一个可能的解决方案,尽量减少使用VBA代码。

    作为出发点,我会做的是重新为每个人编码。在一个单独的单元格中保留更多的代码,并不像单个代码那样易于管理。当然,我会保持每个代码与每个人的关联。一种方法是使用公式替换,并用分号替换返回的字符。该公式的工作原理如下:

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

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

    一旦更换了分号,复制和粘贴值,并返回然后用功能“文本分列”中的数据选项卡,您将每个单元格转换为一系列的列(取决于你有多少代码在上市您的工作表的原始单元格)。现在,你会在第一列中,您有个人的名字的情况,然后在同一行中,你拥有所有相关的代码,也喜欢在这里下面的图片随后的列:

    Converted Reference Table

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

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

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

    凡COUNTIF的第一个参数是指在转换表,第二个参数的代码是在您的专栏“代码”代码,您粘贴唯一的代码。

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

    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) 
    

    其中第一个参数是代码,第二个是转换表中的个人列表(它应该是第一列),然后第三个是转换表中代码的列。作为这个自定义公式的结果,您将拥有以逗号分隔的个人列表。

    以上所有都适用于我的电脑,但如果您需要更多信息,请不要犹豫与我联系。

    +0

    优秀的解决方案和过程的解释!谢谢。只是一件小事情 - 它是以下CHAR代码,它用来替代分号的新行:= SUBSTITUTE(B4,CHAR(10),CHAR(45)) 除此之外,一切都很顺利。 –

    +0

    我相信CHAR代码的差异可能是因为我使用的是Mac,而您可能使用的是Windows。 – Michele