Excel 中有一列包含逗号分隔的列表:
Header
1, 61
61
1, 61, 161
5, 55
我想提取这些数据,以便我可以计算每个项目的出现次数,以便得到以下结果:
Count of Items
1 | 2
5 | 1
55 | 1
61 | 3
161 | 1
我尝试使用“*”进行 countif 但结果很乱,因为在这种情况下我有前缀或后缀(1,61,161)
请帮忙!
答案1
选项1:
我想建议使用 UDF(用户定义函数),它不仅可以计算逗号分隔数字的出现次数,还可以计算文本。
怎么运行的:
按Alt+F11然后获取 VB 编辑器复制&粘贴此代码为模块。
Option Explicit Function CountOccurrence(SearchRange As Range, Phrase As String) As Long Dim RE As Object, MC As Object Dim sPat As String Dim V As Variant Dim I As Long, J As Long V = SearchRange Set RE = CreateObject("vbscript.regexp") With RE .Global = True .MultiLine = True .ignorecase = True .Pattern = "(?:^|,\s*)" & Phrase & "(?:\s*,|$)" End With For I = 1 To UBound(V, 1) If RE.test(V(I, 1)) Then J = J + 1 Next I CountOccurrence = J End Function
在范围中输入条件
H18:H26
,然后在单元格中输入此公式I18
并填写。
=CountOccurrence($G$18:$G$24,H18)
选项 2:
在单元格中输入此公式I18
并填写。
=SUMPRODUCT(--ISNUMBER(FIND(H18,$G$18:$G$24)))
根据需要调整单元格引用。
答案2
答案3
看起来您已经有了解决方案,但我会提出一个处理动态数据的非 VBA 解决方案。它使用一些辅助列,您可以将其预填充到任意大的范围。当没有关联数据时,单元格将为空白。可以消除一些辅助列;包含它们是为了最大限度地减少重复,但可以隐藏所有辅助列。
您的数据在 A 列中。B 列根据逗号的数量确定每个条目中的值的数量。B3 中的公式为:
=IF(ISBLANK(A3),"",LEN(A3)-LEN(SUBSTITUTE(A3,",",""))+1)
C 列只是 B 列的累计组件计数。C2 输入为0
。C3 中的公式为:
=IF(ISBLANK(A3),"",SUM(B3:B$3))
将 B 列和 C 列填充到尽可能多的行中,只要有数据即可。如果需要,您可以随时扩展这些列。
E 列只是为了方便。它为解析的值提供了索引。您可以对 进行硬编码,1
然后为每个连续行添加 1。出于任何原因,我根据行号(-2
下面公式中的 是调整值以从 开始1
)来设置它。超出总值数量的单元格将变为空白。我在 E3 中的公式:
=IF(ROW()-2>MAX($C$2:$C$10),"",ROW()-2)
F 列只是为了避免公式重复。它会提取相关的 A 列条目,从中解析当前组件。F3 中的公式是:
=IFERROR(OFFSET($A$2,MATCH(E3-1,$C$2:$C$10,1),0),"")
它通过比较 E 列中的组件编号与 C 列中的累积组件计数来找到适当的条目。
G 列是解析后的组件值,全部位于单个连续的列中,便于操作。G3 中的公式为:
=IFERROR(TRIM(MID(SUBSTITUTE(F3,",",REPT(" ",LEN(F3))),(E3-INDEX($C$2:$C$10,MATCH(E3-1,$C$2:$C$10,1))-1)*LEN(F3)+1,LEN(F3))),"")
通过从当前元素编号中减去最后一个“完成”的输入记录的累积元素数来确定从 F 列条目中解析哪个元素。
列 E 到 G 应扩展到足够多的行,以覆盖预期的组件值数量(至少是数据行数的几倍)。请注意,上述所有引用范围 $C$2:$C$10 的公式都应进行调整,以包含您数据的全部范围。
现在,您已将所有解析的元素放在一个漂亮的列中,有多种方法可以聚合它们并获取计数。我使用了数据透视表,它同时还为您提供了唯一值的列表。
选择数据透视表 G 列的完整预填充范围。将该字段用于行窗口和值窗口(选择计数作为聚合)。该范围将包括未使用的行中的空白,因此请使用内置过滤器取消选择空白。
当数据发生变化时,只需刷新数据透视表并验证过滤器中是否选择了任何新元素值。