在Excel中,如何计算列中字符串的实例数

Ben*_*ott 2 excel sum excel-formula countif

我有一个专栏,其中包含在不同日期参加过活动的不同工作人员。有时只有一个人参加,有时则有多人参加。我希望能够计算出每个员工参加的次数。我已经尝试过了COUNTIF(),但是这不适用于多人参加的情况。

工作人员出席
约翰
戴夫
标记
本、约翰
马克、约翰
本和戴夫
马克和约翰

在上表中,我希望能够计算出每个员工参加的次数。

我提前道歉,我确信这个问题有时被问到并得到回答,但我可能缺乏对语法以及如何表达我的查询的认识。

May*_*rya 5

假设没有Excel Constraints按照发布的标签,那么可以使用GROUPBY()当前可用的,MS365 Beta Channel然后以下应该可以工作。

在此输入图像描述


=LET(
     _StaffAttending, TOCOL(TEXTSPLIT(TEXTAFTER(", "&SUBSTITUTE(A2:A9," &",","),", ",SEQUENCE(,10)),", "),2),
     GROUPBY(_StaffAttending,_StaffAttending,COUNTA,0,0))
Run Code Online (Sandbox Code Playgroud)

为了让事情更清楚,上面的公式可以扩展到更多步骤:

在此输入图像描述


=LET(
     _SameDelimiters, SUBSTITUTE(A2:A9," &",","),
     _CountDelimiters, LEN(_SameDelimiters)-LEN(SUBSTITUTE(_SameDelimiters,", ",)),
     _Instance_Num, SEQUENCE(,MAX(_CountDelimiters)),
     _SplitByRow, TOCOL(TEXTSPLIT(TEXTAFTER(", "&_SameDelimiters,", ",_Instance_Num),", "),2),
     _Output, GROUPBY(_SplitByRow,_SplitByRow,COUNTA,0,0),
     _Output)
Run Code Online (Sandbox Code Playgroud)

或者,使用MMULT()与上面相同的步骤,但它用于MMULT()通过两个数组的矩阵乘法来获取数字计数。

在此输入图像描述


=LET(
     _StaffAttending, TOCOL(TEXTSPLIT(TEXTAFTER(", "&SUBSTITUTE(A2:A9," &",","),", ",SEQUENCE(,10)),", "),2),
     UNIQUE(HSTACK(_StaffAttending, MMULT(N(_StaffAttending=TOROW(_StaffAttending)),SEQUENCE(ROWS(_StaffAttending),,,0)))))
Run Code Online (Sandbox Code Playgroud)

或者,使用POWER QUERY在这里会更合适,因为它可以处理相当多的数据集,因此要使用上述过程实现此目的,请使用POWER QUERYwindow遵循以下简单步骤UI


在此输入图像描述


  • 首先将源范围转换为表并相应命名,在本例中我将其命名为Table_1

  • 接下来,从DataTab --> Get & Transform Data--> Get Data--> From Other Sources-->打开一个空白查询Blank Query

  • 上面的内容让Power Query窗口打开,现在从HomeTab --> Advanced Editor--> 并通过删除您看到的任何内容来粘贴以下内容M-Code,然后按Done

let
    Source = Excel.CurrentWorkbook(){[Name="Table_1"]}[Content],
    #"Replaced Value" = Table.ReplaceValue(Source," &",",",Replacer.ReplaceText,{"Staff attending"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value", {{"Staff attending", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Staff attending"),
    #"Trimmed Text" = Table.TransformColumns(#"Split Column by Delimiter",{{"Staff attending", Text.Trim, type text}}),
    #"Grouped Rows" = Table.Group(#"Trimmed Text", {"Staff attending"}, {{"Count", each Table.RowCount(_), Int64.Type}})
in
    #"Grouped Rows"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


  • 最后,要将其导入回Excel--> 单击Close & LoadClose & Load To--> 单击的第一个将创建一个New Sheet具有所需输出的文件,而后者将提示一个窗口,询问您将结果放在哪里。

但是,也可以使用COUNTIFS()COUNTIF()使用来完成此操作wildcard operator *,如果手动列出员工姓名,则

在此输入图像描述


=COUNTIF($A$2:$A$9,"*"&C2:C5&"*")
Run Code Online (Sandbox Code Playgroud)

要列出参加的员工的唯一姓名,可以使用:

=UNIQUE(TOCOL(TEXTSPLIT(TEXTAFTER(", "&SUBSTITUTE(A2:A9," &",","),", ",SEQUENCE(,10)),", "),3))
Run Code Online (Sandbox Code Playgroud)

发布的所有上述解决方案都没有使用任何LAMBDA()迭代,也没有使用TEXTJOIN()函数,并且特别避免后者的原因是,因为所述函数有字符限制,如果超过限制将呈现#VALUE!错误。我们不知道数据集有多大,也不知道数据集是否有全名或只有名字。但是,发布作为替代方案:

在此输入图像描述


=LET(
     _Split, TEXTSPLIT(TEXTJOIN("|",,A2:A9),,{"|",", "," & "}),
     GROUPBY(_Split, _Split, COUNTA,,0,))
Run Code Online (Sandbox Code Playgroud)

或者,

=LET(
     _Split, TEXTSPLIT(TEXTJOIN("|",,A2:A9),,{"|",", "," & "}),
     PIVOTBY(_Split,, _Split, COUNTA,,0,))
Run Code Online (Sandbox Code Playgroud)

或者,

在此输入图像描述


=LET(
     _Split, TEXTSPLIT(TEXTJOIN("|",,A2:A9),,{"|",", "," & "}),
     UNIQUE(HSTACK(_Split,MMULT(N(_Split=TOROW(_Split)),SEQUENCE(ROWS(_Split),,,0)))))
Run Code Online (Sandbox Code Playgroud)