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

使用Excel在字母数字字符串中出现的某些字母的总和,excel,parsing,match,string-matching,Excel,Parsing,Match,String Matching,我有一个用于应用程序测试的字母数字数据数组,出于某些原因,我需要计算每个字符串中从“a”到“f”的字母出现次数的总和(这将用于进一步的数据处理): 这就是字符串的样子,它们的长度大约是10-30个符号,我想每天大约有3-5k个符号用于处理。假设和限制: 信的大小写无关紧要(幸好) 字母列表可能会在某一天发生变化,但很可能仍然保持一个范围,例如a-k、d-g等-因此解决方案应尽可能灵活 不禁止任何临时计算/范围,但越短越好 我更喜欢纯Excel解决方案,但如果太复杂,VBA仍然是一个选项。然而,如

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

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

  • 信的大小写无关紧要(幸好)
  • 字母列表可能会在某一天发生变化,但很可能仍然保持一个范围,例如a-k、d-g等-因此解决方案应尽可能灵活
  • 不禁止任何临时计算/范围,但越短越好
  • 我更喜欢纯Excel解决方案,但如果太复杂,VBA仍然是一个选项。然而,如果第一个公式按预期工作,那么复杂的Excel公式比“两行代码”VBA更好
  • 到目前为止我已经尝试过的事情(我注意到,这里的实践非常受欢迎):

    • 搜索已回答的问题,但没有找到任何类似的基于Excel的解决方案。其他语言/方法不可选择(VBA除外)
    • 到目前为止,我自己得到的最好的东西是嵌套的
      SUBSTITUTE
      函数,但它既脏又简单。假设范围可能变为c-x,那将是一场噩梦
    • 我不是一个擅长的新手,但像复杂的数组公式这样的东西对我来说仍然是个难题——唉,但确实如此

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

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

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

    以数组公式的形式输入公式,即按Ctrl-Shift-Enter。

    您可以使用替换,而无需嵌套多个替换函数,例如,A1中的文本字符串B1中的此公式将计算所有字母a到f(大写或小写)

    =SUMPRODUCT(LEN(A1)-LEN(替换(较低的(A1),{a”,“b”,“c”,“d”,“e”,“f”},”)))

    对于较长的字母列表,如c到x,可以使用此版本来避免列出所有字母

    =SUMPRODUCT(LEN(A1)-LEN(替换(较低的(A1))、CHAR(96+行(间接的(“3:24”)、”))


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

    此公式假定您的数据位于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))).
    

    =SUM(--)(中(A1,行(间接)(“1:&LEN(A1))),1))>=UPPER($F$1))*--(中(A1,行(间接)(“1:&LEN(A1))),1))=$F$1)*--(中(A1,行($1:$50),1))这是我的选择——与已经发布的内容非常相似,但无论如何……特别是如果你对学习感兴趣,这在今天是如此罕见)

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

    =SUM(LEN($A2)-LEN(SUBSTITUTE($A2,CHAR(ROW(INDIRECT(CODE("a")&":"&CODE("f")))),"")))
    
    就像提醒一样-按CTRL+SHIFT+ENTER键而不是通常的ENTER键

    一些解释:

  • 字母a-f的范围使用范围边的字符代码生成,并使用
    char(行(间接(…))
    结构转换回字符数组
  • 然后“噩梦”来帮忙,最后总结得到的替换字符串减法与原始字符串减法的数量
  • 因此,在这种双重转换的情况下,您不需要codetable)
  • 还有两个类似的“坚果”样本——只是为了学习

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

    =SUM(LEN($A2)-LEN(SUBSTITUTE($A2,ROW($1:$10)-1,"")))
    
    这里的技巧是,我们可以使用数组或行号1-10生成数字0-9减去1-
    行(0)
    将生成错误

    最后,如果需要计算字符串中所有数字的总和,请使用以下方法:

    =SUM(IFERROR(VALUE(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),0))
    
    在这里,我们对每个字符使用
    MID
    将初始字符串分解为字母,然后使用
    IFERROR
    将其作为数字进行测试,并对数字以外的任何字符返回0

    最后2个(显然)是你最喜欢的阵列螺母)

    我在针对QA人员的Excel培训中使用了上述示例(顺便说一句,欢迎来到SE,同事!),从而展示了螺母开裂的典型功能/方法。希望这对你也有用。然而,前面的所有答案至少值得你公平投票,特别是@barry的无坚果食谱)

    为方便起见,共享示例文件:


    祝您测试顺利)

    +1“无坚果配方”!还有很多很好的信息……用于对所有数字求和(有点离题?)我更喜欢扩展LEN(替换)解决方案,即
    =SUMPRODUCT(LEN(A2)-LEN(替换($A2,{1,2,3,4,5,6,7,8,9}),{1,2,3,4,5,6,7,8,9})
    @barryhoudini你很受欢迎,伙计),顺便说一下,我总是倾向于简化公式的语法,避免“硬编码”值-例如手动数组。也许您看到了使用类似于我的示例的数组公式和构造的一些缺点(对于初学者来说似乎很复杂除外)?我从沃肯巴赫和他的圣经中学到了这些技巧…@PeterL。如此详细而透彻的解释真是太好了!我接受你的努力和提供的样品的答复。数字计数和数组公式“查看内部”正是我在“螺母裂纹”中需要的东西。请您简要解释/提供一个链接,以了解
    --
    符号的用途?@PeterL.:
    --
    两次求反,即返回相同的结果-但具有将布尔值TRUE/FALSE转换为数字1/0的积极副作用!因此,在一个lo中
    =SUM(LEN($A2)-LEN(SUBSTITUTE($A2,ROW($1:$10)-1,"")))
    
    =SUM(IFERROR(VALUE(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),0))