我试图通过尽量减少 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)
第一个参数是代码,第二个是转换表中的个人列表(应该是第一列),然后第三个是转换表中带有代码的列。由于使用此自定义公式,您将获得以逗号分隔的个人列表。
以上所有内容都可以在我的电脑上运行,但如果您需要更多信息,请随时与我联系。