在使用Excel的字母数字string中出现某些字母的总和
我在应用程序testing中使用了一系列字母数字数据,由于某些原因,我需要计算每个string中从“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
这是string的样子,它们的长度大约是10-30个符号,我想每天有3-5K个字符用于处理。 假设和限制:
- 信件的情况并不重要(愉快)。
- 字母列表可能有一天会改变,但很有可能仍然是一个范围 ,如ak,dg等 – 因此解决scheme应该尽可能地灵活。
- 任何临时计算/范围都是不被禁止的,但越短越好。
- 我更喜欢纯粹的Excel解决scheme,但如果它太复杂 – VBA仍然是一个select。 不过,复杂的Excel公式比“2行代码”VBA更好 – 如果第一个按预期工作的话。
我已经尝试过的东西(正如我注意到的那样,这里的练习非常受欢迎):
- 通过已经回答的问题search,但没有发现任何类似的基于Excel的解决scheme。 其他语言/方法不是一个选项(VBA除外)。
- 目前为止,我自己做的最好的事情是嵌套
SUBSTITUTE
函数,但它很脏,很直接。 假设范围可能会变成cx这将是一场噩梦。 - 我不是Excel的新手,但像复杂的数组公式仍然是我的坚果 – 唉,但真的…
无论如何,我并不要求“准备好”“现成”的解决scheme – 我寻求帮助和正确的方向/方法进行自我学习和进一步理解类似的问题。
这是我的select – 非常类似于已经发布,但无论如何…尤其是如果你有兴趣学习,这是非常罕见的今天)
假设你有你的列表A2开始,使用下面的数组公式:
=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,CHAR(ROW(INDIRECT(CODE("a")&":"&CODE("f")))),"")))
就像提醒一样 – 按CTRL + SHIFT + ENTER而不是通常的ENTER 。
一些解释:
- 字母a的范围是使用范围边缘的char代码生成的,使用
CHAR(ROW(INDIRECT(...)))
结构转换回到chars数组。 - 然后,“噩梦”来帮助,最后总结得到的取代与原来的string减法数。
- 因此,在这种双重转换的情况下,你不需要codetable)))
还有两个更类似的“坚果”样本 – 仅供学习之用。
如果你需要总结所有的数字匹配 – 你仍然可以使用上面的使用0和9作为input(数字是从48到57代码从0开始的字符)。 但是,下面更简单的解决scheme也将会发生:
=SUM(LEN($A2)-LEN(SUBSTITUTE($A2,ROW($1:$10)-1,"")))
这里的诀窍是我们可以使用数组或行号1-10 减 1来生成数字0-9 – ROW(0)
会生成一个错误。
最后,如果您需要计算string中所有数字的总和,请使用:
=SUM(IFERROR(VALUE(MID($A2,ROW(INDIRECT("1:"&LEN($A2))),1)),0))
在这里,我们用MID
初始化string到每个单个字符,然后使用IFERROR
对数字进行testing,除了数字之外,返回0。
最后2(显然)是你心爱的arrays坚果)))
我在Excel培训中使用了上述样本(欢迎SE,同事!),从而演示了坚果开裂的典型function/方法。 希望对你有用。 但是,所有以前的答案值得至less你公平的upvote,尤其是@巴里的坚果免费食谱)
为了您的方便,示例文件是共享的: https : //www.dropbox.com/s/qo5k479oyawkrzh/SumLettersCount.xlsx
祝你好运与你的testing)
您可以使用SUBSTITUTE而不嵌套多个SUBSTITUTE函数,例如在A1中使用文本string。在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代表所有字母。
此公式假定您的数据在列A中,您正在查找的范围的第一个字母在F1中,而G1中的最后一个字母。 它需要作为数组公式input,然后复制到数据的底部。
=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中的最后一个字母。
如果您确定任何string中的字符数不会超过某个最大数字(例如50),则公式可以简化为:
=SUM(--(UPPER(MID(A1,ROW($1:$50),1))>=$F$1)*--(UPPER(MID(A1,ROW($1:$50),1))<=$G$1))
假设你的数据在A列,试试这个公式:
=SUM(--NOT(ISERROR(SEARCH(MID(A1,ROW($1:$99),1),"abcdef"))))-99+LEN(A1)
input公式作为数组公式,即按Ctrl – Shift – Enter 。