4

我有一个用于应用程序测试的字母数字数据数组,由于某些原因,我需要计算每个字符串中从“a”到“f”的字母出现的总和(这将用于进一步的数据处理):

02599caa0b600 --> should be 4
489455f183c1fb49b --> should be 5
678661081c1h
66410hd2f0kxd94f5bb
8a0339a4417
f6d9f967ts4af6e
886sf7asc3e85ec
03f1fhh3c3a2am
e491b17638m60
1m8h2m07bhaa4tnhbc4
29ma900a80m96m65
ca6a75f505tsac8
956828db8ts7fd1d
cf1d220a59a7851180e
a8b7852xd9e7a9
b85963fbe30718db9976
39b8kx8f85abb1b6
0xxb3b648ab
a8da75f730d45048
588h69d344

这就是字符串的样子,它们的长度大约是 10-30 个符号,我想每天大约有3-5k个用于处理。假设和限制:

  1. 字母大小写无关紧要(高兴地)。
  2. 字母列表可能有一天会改变,但很可能仍然是一个范围,例如 ak、dg 等 - 因此解决方案应该尽可能灵活。
  3. 不禁止任何临时计算/范围,但越短越好。
  4. 我更喜欢纯 Excel 解决方案,但如果它太复杂 - VBA 仍然是一种选择。然而,复杂的 Excel 公式比“2 行代码”VBA 更好 - 如果第一个按预期工作。

到目前为止我尝试过的事情(我注意到,这里的做法非常受欢迎):

  • 搜索已经回答的问题,但没有找到任何类似的基于 Excel 的解决方案。其他语言/方法不是一种选择(VBA 除外)。
  • 到目前为止,我自己得到的最好的东西是嵌套SUBSTITUTE函数,但它很脏而且非常简单。假设范围可能会更改为 cx,那将是一场噩梦。
  • 我不是 Excel 的新手,但复杂的数组公式之类的东西对我来说仍然是个难题——唉,但确实如此……

无论如何,我不要求“即用型”“开箱即用”的解决方案——我要求帮助和正确的方向/方法来自学和进一步理解类似的问题。

4

4 回答 4

6

您可以在不嵌套多个 SUBSTITUTE 函数的情况下使用 SUBSTITUTE,例如,对于 A1 中的文本字符串,B1 中的这个公式将计算所有字母 a 到 f(大写或小写)

=SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),{"a","b","c","d","e","f"},"")))

对于像 c 到 x 这样更长的字母列表,您可以使用此版本来避免将它们全部列出

=SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(LOWER(A1),CHAR(96+ROW(INDIRECT("3:24"))),"")))

3:24 代表字母 3 (c) 到字母 24 (x),因此您可以轻松地将所有字母更改为 1:26 或将 o 更改为 15:25 到 y 等。

于 2013-02-05T22:41:31.883 回答
4

这是我的选择 - 与已经发布的非常相似,但无论如何......特别是如果你有兴趣学习,这在今天非常罕见)

假设您的列表以 A2 开头,请使用以下数组公式:

=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,CHAR(ROW(INDIRECT(CODE("a")&":"&CODE("f")))),"")))

就像提醒一样 - 按CTRL+ SHIFT+ENTER而不是通常ENTER

一些解释:

  1. CHAR(ROW(INDIRECT(...)))字母范围 af 是使用范围边缘的字符代码生成的,使用结构转换回字符数组。
  2. 然后“噩梦”来帮忙,最后总结获得的替换与原始字符串减法的数量。
  3. 因此,在这种双重转换的情况下,您不需要代码表)))

还有两个类似的“坚果”样本——仅用于学习目的。

如果您需要汇总所有数字匹配项- 您仍然可以使用 0 和 9 作为输入(数字是从 0 开始的 48 到 57 个代码的字符)。但是,以下更简单的解决方案也将适用:

=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,ROW($1:$10)-1,"")))

这里的技巧是我们可以使用数组或行号 1-10减去1 生成数字 0-9 -ROW(0)会产生错误。

最后,如果您需要计算字符串中所有数字的总和- 使用这个:

=SUM(IFERROR(VALUE(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),0))

MID在这里,我们使用每个字符将初始字符串分解为字母,然后测试它是否是一个数字IFERROR,并使用除数字以外的任何内容返回 0。

最后 2 个(显然)是你心爱的阵列坚果)))

我在我的 Excel 培训中使用上述示例进行质量检查(顺便说一句,欢迎来到 SE,同事!),从而展示了坚果破解的典型功能/方法。希望这对你也有用。然而,所有之前的答案至少值得你公平地投票,尤其是@barry 的无坚果食谱)

为方便起见,共享示例文件:https ://www.dropbox.com/s/qo5k479oyawkrzh/SumLettersCount.xlsx

祝你测试顺利)

于 2013-02-06T00:12:05.247 回答
3

此公式假定您的数据在 A 列中,您要查找的范围的第一个字母在 F1 中,最后一个字母在 G1 中。它需要作为数组公式输入,然后复制到数据的底部。

  =SUM(--(UPPER(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>=UPPER($F$1))*--(UPPER(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<=UPPER($G$1))).

请注意,如果您要更改的字母范围,您需要更改单元格 F1 中的第一个字母和 G1 中的最后一个字母。

如果您确定任何字符串中的字符数不会超过某个最大数,例如 50,那么公式可以简化为:

  =SUM(--(UPPER(MID(A1,ROW($1:$50),1))>=$F$1)*--(UPPER(MID(A1,ROW($1:$50),1))<=$G$1))
于 2013-02-05T23:02:25.537 回答
0

假设您的数据在 A 列中,请尝试以下公式:

=SUM(--NOT(ISERROR(SEARCH(MID(A1,ROW($1:$99),1),"abcdef"))))-99+LEN(A1)

将公式输入为数组公式,即按Ctrl- Shift- Enter

于 2013-02-05T22:39:52.477 回答