首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较和计数值

比较和计数值
EN

Stack Overflow用户
提问于 2015-11-28 16:22:36
回答 1查看 89关注 0票数 0

我有一个表,我们称它为我的 adjacent ,与下面的表非常相似,它包含一列个人以及在相邻单元格中列出的相应代码。每个人的代码都列在个人姓名旁边的同一相邻单元中,并由回车分隔。

示例表

我想做的是:

  • 为每个人运行代码单元格
  • 对于单个代码单元格中的每个代码,请检查此代码是否存在于单独的代码表中。
  • 如果代码存在于代码表中,则将n+1添加到相邻单元格中该代码的总计数中,并将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。
  • 如果代码不存在于代码表中,则将代码添加到代码表中,将n+1添加到相邻单元格中该代码的总计数中,并将个人姓名添加到另一个相邻单元格中具有相同代码的个人列表中。

在示例表上运行该算法的结果

如果一个类似的程序能达到同样的效果,那么我也会接受的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 12:31:47

我试图通过最小化VBA代码的使用来给您一个可能的解决方案。

作为起点,我要做的是重新安排每个人的代码。在单个单元格中保存更多的代码,而返回则不像每个单元格有一个代码那样容易管理。当然,我将保留与每个个体相关联的每一段代码。使用数据的一种方法是使用公式替代并用分号替换返回字符。这个公式是这样工作的:

代码语言:javascript
运行
复制
=SUBSTITUTE(B2,CHAR(13),CHAR(59))

B2是将返回转换为分号的单元格。然后您将对B列中的所有值使用此公式。

使用分号替换返回后,复制和粘贴值,然后使用数据选项卡中的“文本到列”函数,您将将每个单元格转换为一系列列(取决于您在工作表原始单元格中列出的代码)。现在,您将遇到这样的情况:第一列具有个人名称,然后在随后的列中的同一行中有所有相关代码,如下图所示:

为了创建所有代码的完整列表,可以轻松地使用代码复制所有列。将代码粘贴到一个合适的空间(我建议在一个新的工作表中),然后用一些复制和粘贴作业将所有代码放在同一列下。选择“所有代码”,并在“数据”选项卡中使用“删除重复项”按钮,您将在原始表中包含所有唯一代码的列表。

然后,您可以复制和粘贴列与您在“代码”列下创建的所有唯一代码。现在,您可以使用以下公式计算转换表中的代码:

代码语言:javascript
运行
复制
=COUNTIF($B$1:$C$4, D2)

COUNTIF的第一个参数指的是转换表中的代码,第二个参数是列中的代码-- " codes“,其中粘贴了唯一的代码。

现在,据我所知,Excel中没有创建由逗号分隔的名称列表的函数(但我很高兴发现,如果有人知道!)。因此,我创建了一个带有一些VBA代码的自定义代码,其中包含名称列表个人:

代码语言:javascript
运行
复制
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

因此,最后一步是在“个人”细胞下面使用这个公式,如下所示:

代码语言:javascript
运行
复制
=ListIndividuals(D2,$A$13:$A$16,$D$13:$E$16)

如果第一个参数是Code,第二个参数是转换表中的个人列表(应该是第一列),那么第三个参数是转换表中代码的列。作为这个自定义公式的结果,您将有用逗号分隔的个人列表。

以上所有工作在我的电脑上,但如果您需要更多的信息,请随时与我联系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33973561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档