我有一个表,我们称它为我的 adjacent ,与下面的表非常相似,它包含一列个人以及在相邻单元格中列出的相应代码。每个人的代码都列在个人姓名旁边的同一相邻单元中,并由回车分隔。
我想做的是:
如果一个类似的程序能达到同样的效果,那么我也会接受的。
发布于 2015-11-29 12:31:47
我试图通过最小化VBA代码的使用来给您一个可能的解决方案。
作为起点,我要做的是重新安排每个人的代码。在单个单元格中保存更多的代码,而返回则不像每个单元格有一个代码那样容易管理。当然,我将保留与每个个体相关联的每一段代码。使用数据的一种方法是使用公式替代并用分号替换返回字符。这个公式是这样工作的:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2是将返回转换为分号的单元格。然后您将对B列中的所有值使用此公式。
使用分号替换返回后,复制和粘贴值,然后使用数据选项卡中的“文本到列”函数,您将将每个单元格转换为一系列列(取决于您在工作表原始单元格中列出的代码)。现在,您将遇到这样的情况:第一列具有个人名称,然后在随后的列中的同一行中有所有相关代码,如下图所示:
为了创建所有代码的完整列表,可以轻松地使用代码复制所有列。将代码粘贴到一个合适的空间(我建议在一个新的工作表中),然后用一些复制和粘贴作业将所有代码放在同一列下。选择“所有代码”,并在“数据”选项卡中使用“删除重复项”按钮,您将在原始表中包含所有唯一代码的列表。
然后,您可以复制和粘贴列与您在“代码”列下创建的所有唯一代码。现在,您可以使用以下公式计算转换表中的代码:
=COUNTIF($B$1:$C$4, D2)
COUNTIF的第一个参数指的是转换表中的代码,第二个参数是列中的代码-- " codes“,其中粘贴了唯一的代码。
现在,据我所知,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)
如果第一个参数是Code,第二个参数是转换表中的个人列表(应该是第一列),那么第三个参数是转换表中代码的列。作为这个自定义公式的结果,您将有用逗号分隔的个人列表。
以上所有工作在我的电脑上,但如果您需要更多的信息,请随时与我联系。
https://stackoverflow.com/questions/33973561
复制相似问题