比较和计数值
Comparing and counting values
我有一个 table,我们称它为我的 Individuals Table,很像下面的那个,包含一列个人及其对应的相邻单元格中列出的代码。每个人的代码都列在个人姓名旁边的同一个相邻单元格中,并用回车分隔 return.
Example table
我想做的是:
运行 通过每个个体的代码单元
对于个人代码单元格中的每个代码,检查此代码是否存在于单独的 代码中 Table
如果代码存在于 Codes Table 中,将 n+1 添加到相邻单元格中该代码的总数,然后添加将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。
如果代码Table中不存在该代码,请将代码添加到代码Table ],将 n+1 添加到相邻单元格中该代码的总数,并将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表。
Result of running the algorithm on the example table
如果类似的程序可以达到相同的结果,那么我也愿意。
我尝试通过尽量减少使用 VBA 代码来为您提供一个可能的解决方案。
作为起点,我会为每个人重新排列代码。在由 return 分隔的单个单元格中保留更多代码,这不像每个单元格都有一个代码那样易于管理。当然,我会将每个代码与每个人相关联。一种方法是使用您的数据,使用公式替换并将 returns 字符替换为分号。公式是这样工作的:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2 是您要将 returns 转换为分号的单元格。然后,您将对 B 列中的所有值使用此公式。
将 returns 替换为分号后,复制并粘贴值,然后在“数据”选项卡中使用 "Text to Columns" 函数,您会将每个单元格转换为一系列列(取决于列的数量您在 sheet 的原始单元格中列出的代码)。现在您将处于这样一种情况,第一列是个人姓名,然后在后续列的同一行中您有所有相关代码,如下图所示:
为了创建所有代码的完整列表,您可以轻松复制所有包含代码的列。将代码粘贴到 suitable space 中(我建议在新作品中sheet),然后通过一些复制和粘贴作业将所有代码放在同一列下。 Select 所有代码和按钮 "Remove Duplicates" 始终位于“数据”选项卡中,您将获得原始 table.
中包含的所有唯一代码的列表
然后您可以复制并粘贴包含您在 "Codes" 列下创建的所有唯一代码的列。现在您可以使用以下公式计算转换后的 table 中的代码:
=COUNTIF($B:$C, D2)
其中 COUNTIF 的第一个参数指的是转换后的 table 中的代码,第二个参数是您粘贴唯一代码的列 "Codes" 中的代码。
据我所知,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
最后一步是在 "Individuals" 单元格下使用此公式,如下所示:
=ListIndividuals(D2,$A:$A,$D:$E)
其中第一个参数是代码,第二个参数是转换后的个体列表table(应该是第一列),然后第三个参数是转换后的代码列table。作为此自定义公式的结果,您将获得用逗号分隔的个人列表。
以上所有内容均适用于我的电脑,但如果您需要更多信息,请随时与我联系。
我有一个 table,我们称它为我的 Individuals Table,很像下面的那个,包含一列个人及其对应的相邻单元格中列出的代码。每个人的代码都列在个人姓名旁边的同一个相邻单元格中,并用回车分隔 return.
Example table
我想做的是:
运行 通过每个个体的代码单元
对于个人代码单元格中的每个代码,检查此代码是否存在于单独的 代码中 Table
如果代码存在于 Codes Table 中,将 n+1 添加到相邻单元格中该代码的总数,然后添加将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。
如果代码Table中不存在该代码,请将代码添加到代码Table ],将 n+1 添加到相邻单元格中该代码的总数,并将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表。
Result of running the algorithm on the example table
如果类似的程序可以达到相同的结果,那么我也愿意。
我尝试通过尽量减少使用 VBA 代码来为您提供一个可能的解决方案。
作为起点,我会为每个人重新排列代码。在由 return 分隔的单个单元格中保留更多代码,这不像每个单元格都有一个代码那样易于管理。当然,我会将每个代码与每个人相关联。一种方法是使用您的数据,使用公式替换并将 returns 字符替换为分号。公式是这样工作的:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2 是您要将 returns 转换为分号的单元格。然后,您将对 B 列中的所有值使用此公式。
将 returns 替换为分号后,复制并粘贴值,然后在“数据”选项卡中使用 "Text to Columns" 函数,您会将每个单元格转换为一系列列(取决于列的数量您在 sheet 的原始单元格中列出的代码)。现在您将处于这样一种情况,第一列是个人姓名,然后在后续列的同一行中您有所有相关代码,如下图所示:
为了创建所有代码的完整列表,您可以轻松复制所有包含代码的列。将代码粘贴到 suitable space 中(我建议在新作品中sheet),然后通过一些复制和粘贴作业将所有代码放在同一列下。 Select 所有代码和按钮 "Remove Duplicates" 始终位于“数据”选项卡中,您将获得原始 table.
中包含的所有唯一代码的列表然后您可以复制并粘贴包含您在 "Codes" 列下创建的所有唯一代码的列。现在您可以使用以下公式计算转换后的 table 中的代码:
=COUNTIF($B:$C, D2)
其中 COUNTIF 的第一个参数指的是转换后的 table 中的代码,第二个参数是您粘贴唯一代码的列 "Codes" 中的代码。
据我所知,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
最后一步是在 "Individuals" 单元格下使用此公式,如下所示:
=ListIndividuals(D2,$A:$A,$D:$E)
其中第一个参数是代码,第二个参数是转换后的个体列表table(应该是第一列),然后第三个参数是转换后的代码列table。作为此自定义公式的结果,您将获得用逗号分隔的个人列表。
以上所有内容均适用于我的电脑,但如果您需要更多信息,请随时与我联系。