使用Excel在字母数字字符串中出现某些字母的总和

时间:2013-02-05 22:27:26

标签: excel parsing match string-matching

我在应用程序测试中使用了一系列字母数字数据,出于某些原因,我需要在每个字符串中计算从“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. 字母列表可能会更改一天,但很可能仍然是范围,例如a-k,d-g等 - 因此解决方案应尽可能灵活。
  3. 不禁止任何临时计算/范围,但越短越好。
  4. 我更喜欢纯Excel解决方案,但万一它太复杂了 - VBA仍然是一个选择。然而,复杂的Excel公式比“2行代码”VBA更好 - 如果第一个按预期工作。
  5. 到目前为止我尝试过的事情(我注意到,这里的做法非常受欢迎):

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

    无论如何,我不要求“准备就绪”的“开箱即用”解决方案 - 我寻求帮助和正确的方向/方法进行自学并进一步了解类似的问题。

4 个答案:

答案 0 :(得分: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(对于所有字母)或15:25(对于o至y等)。

答案 1 :(得分:4)

这是我的选择 - 非常类似于已发布的,但无论如何......特别是如果你对学习感兴趣,这在今天是如此罕见)

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

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

正如提醒一样 - 按 CTRL + SHIFT + ENTER 而不是通常的 ENTER

一些解释:

  1. 使用范围边的字符代码生成字母a-f的范围,使用CHAR(ROW(INDIRECT(...)))结构转换回字符数组。
  2. 然后“梦魇”来帮助,最后总结了所获得的替换vs原始字符串减法的数量。
  3. 因此,在这种双重转换的情况下,您不需要代码表)))
  4. 还有两个类似的“坚果”样本 - 仅供学习之用。

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

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

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

    最后,如果你需要在字符串中计算所有数字的总和 - 请使用:

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

    在这里,我们使用MID将每个字符串的初始字符串分解为字母,然后使用IFERROR将其作为数字进行测试,并为除数字之外的任何内容返回0。

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

    我在Excel培训中使用上述样本进行质量保证(顺便欢迎SE,同事!),从而展示了坚果开裂的典型功能/方法。希望对你也有用。然而,所有以前的答案至少应该得到你的公平投票,尤其是@巴里的无坚果食谱)

    为方便起见,我们共享了样本文件:https://www.dropbox.com/s/qo5k479oyawkrzh/SumLettersCount.xlsx

    祝你的测试好运)

答案 2 :(得分: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))

答案 3 :(得分:0)

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

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

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