我有一张桌子,我们称之为 Individuals Table ,非常类似于下面的表格,其中包含一列个人以及相邻单元格中列出的相应代码。每个人的代码都列在个人姓名旁边的同一个相邻单元格中,并用回车符分隔。
我想做的是以下内容:
遍历每个人的代码单元
对于个人代码单元格中的每个代码,请检查此代码是否存在于单独的代码表
如果代码存在于代码表中,请将n + 1添加到相邻单元格中该代码的总计数中,并将该个人的名称添加到具有该代码的个人列表中代码在另一个相邻的单元格中。
如果代码表中不存在代码,请将代码添加到代码表,将n + 1添加到该代码的总计数中在相邻的单元格中,将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。
Result of running the algorithm on the example table
如果类似的程序可以达到相同的结果,那么我也会对此持开放态度。
答案 0 :(得分:0)
我尝试通过最小化VBA代码的使用来为您提供可能的解决方案。
作为起点,我要做的是为每个人重新安排代码。通过返回将单个单元中的更多代码保留在单个单元中,就像管理每个单元的单个代码一样容易。当然,我会保持每个代码与每个人相关联。一种方法是使用公式替换数据,并用分号替换返回字符。该公式适用于此:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2是您将返回值转换为分号的单元格。然后,您将对B列中的所有值使用此公式。
一旦用分号替换了返回值,复制并粘贴了值,然后使用“数据”选项卡中的“文本到列”功能,您将每个单元格转换为一系列列(取决于您在原始列表中列出的代码数量)你工作表的单元格)。现在您将处于第一列您拥有个人姓名的情况,然后在后续列的同一行中您拥有所有相关代码,如下图所示:
为了创建所有代码的完整列表,您可以轻松地使用代码复制所有列。将代码粘贴到合适的空间(我建议在新工作表中),然后使用一些复制和粘贴作业将所有代码放在同一列下。选择所有代码并使用“删除重复项”按钮始终在“数据”选项卡中,您将获得原始表中包含的所有唯一代码的列表。
然后,您可以使用在“代码”列下创建的所有唯一代码复制并粘贴该列。现在,您可以使用以下公式计算转换表中的代码:
=COUNTIF($B$1:$C$4, D2)
COUNTIF的第一个参数指的是转换表中的代码,第二个参数是您在粘贴唯一代码的“代码”列中的代码。
据我所知,Excel中没有函数来创建用逗号分隔的名称列表(但我很高兴发现它存在,如果有人知道!!!)。因此,我创建了一个带有一些名为List Individuals的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)
第一个参数是Code,第二个是转换表中的个体列表(它应该是第一列),然后第三个是转换表中包含代码的列。作为此自定义公式的结果,您将获得以逗号分隔的个人列表。
以上所有内容均适用于我的电脑,但如果您需要更多信息,请随时与我联系。