我试着给你一个可能的解决方案,尽量减少使用VBA代码。
作为出发点,我会做的是重新为每个人编码。在一个单独的单元格中保留更多的代码,并不像单个代码那样易于管理。当然,我会保持每个代码与每个人的关联。一种方法是使用公式替换,并用分号替换返回的字符。该公式的工作原理如下:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2是您将单元格转换为分号的单元格。然后,您将使用此公式计算B列中的所有值。
一旦更换了分号,复制和粘贴值,并返回然后用功能“文本分列”中的数据选项卡,您将每个单元格转换为一系列的列(取决于你有多少代码在上市您的工作表的原始单元格)。现在,你会在第一列中,您有个人的名字的情况,然后在同一行中,你拥有所有相关的代码,也喜欢在这里下面的图片随后的列:
![Converted Reference Table](https://i.stack.imgur.com/jSgXs.png)
为了创建所有代码的完整列表,您可以轻松地复制包含代码的所有列。将代码粘贴到合适的空间(我建议在一个新的工作表中),然后用一些复制和粘贴作业将所有代码放在同一列下。选择所有代码,并在数据选项卡中始终使用“删除重复项”按钮,您将拥有包含在原始表中的所有唯一代码的列表。
然后,您可以复制并粘贴您在“代码”列下创建的所有唯一代码的列。现在你可以用这个公式计算的转换表的代码:
=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)
其中第一个参数是代码,第二个是转换表中的个人列表(它应该是第一列),然后第三个是转换表中代码的列。作为这个自定义公式的结果,您将拥有以逗号分隔的个人列表。
以上所有都适用于我的电脑,但如果您需要更多信息,请不要犹豫与我联系。
优秀的解决方案和过程的解释!谢谢。只是一件小事情 - 它是以下CHAR代码,它用来替代分号的新行:= SUBSTITUTE(B4,CHAR(10),CHAR(45)) 除此之外,一切都很顺利。 –
我相信CHAR代码的差异可能是因为我使用的是Mac,而您可能使用的是Windows。 – Michele