c字符串分割成数组_excel这个复杂数组公式怎么读?

{=COUNT(FIND(MID(B2,ROW($1:$10),1),A2))=10}

数据间的包含关系是Excel函数中的常见问题之一,通常的解法都是利用文本查找函数,如SEARCH函数、FIND函数等等。举个例子,我们要判断子集字符串AB是否被全集字符串ABC所包含,我们会这样做:

b96f2d200bebcace8c4db0b0cf5f8ae0.png

但你知道吗?这些解决方案都有一个共同的致命弱点,那就是有序包含。即子集中各字符串的排列顺序必须和全集字符串一致,顺序不一致就无法成功匹配。例如,A和B都被ABC所包含,但是,AB和BA的FIND返回值却大相径庭。

ed13ecb495caef30d4ddd7273a6e6f5d.png

小花的一名资深粉丝就曾提出了这样一个问题:如何破解这种乱序包含呢?答案就在下图中。这个由四个函数嵌套而成的古怪公式,竟然解决了这个疑难杂症!!!

004b005cb5bc26d07f6ac8a5bcde5851.png

C2公式如下:

{=COUNT(FIND(MID(B2,ROW($1:$10),1),A2))=10}

当我给出这样的答案时,这位花瓣立刻犯了难,这个公式虽然功能强大,但却包含多重嵌套和复杂运算逻辑,让人捉摸不透!别急,且听小花细细分解。

STEP 01 公式分割

复杂公式是一口吞不下的大蛋糕,那就让我们分而食之。根据函数名称和特定符号来分割公式是学习复杂函数的第一步。将复杂公式分割成一个个实现特定功能的小片段,能帮助我们更好地消化理解。

ps:这里提到的特定符号包含划分函数各参数的逗号,表示优先计算序的括号,比较运算符<>=等。

接下来让我们来试着分割下这个复杂公式。

ed28c7425b3d7668e01c39f0f632f6e0.png

STEP 02 各个击破

上图中我们将公式划分成五个独立的小片段,这一步我们就来逐一解读每一部分的运算逻辑和目标功能。

① {}

大括号{}是数组公式的标志,正常输入函数后,立即按Ctrl+ Shift+Enter即可进行数组运算。数组公式可以认为是多个相同结构函数公式的集合,数组公式中的公式按重复的运算方法、次序和逻辑重复运算多次,即数组运算的返回值是一组数,而非单一值。

这可能很难理解,没关系,在接下来的讲解中我们还是穿插讲解数组运算的原理。

② ROW($1:$10)

ROW函数是返回单元格行号的简单函数,它的基本语句是= ROW(要返回行号的单元格),ROW(A1)=1, ROW(A2)=2。1:10表示第一行到第十行(具体所需行数是乱序字符串的最大字符数而定),那么片段②ROW($1:$10)则返回1:10行的行号,即

ROW($1:$10)={1,2,3,4,5,6,7,8,9,10}

这就是数组运算的魔力,原本仅能返回单一值的ROW函数,此时可以对每一个参数进行运算,并逐一返回结果,形成一组数。数组公式中的其他片段同此理。

③ MID(B2, ②,1)

MID函数是从字符串的某一个字符开始,截取指定个数字符的函数。它的基本语句是MID(目标字符串,截取的起始位置,截取的字符个数)。举个例子,MID("秋叶Excel",3,5),它是从第3个字符串E开始,截取5个字符,即为Excel,如图。

3850f0b732e303de4d7007f74ca394a9.png

于是乎,我们解开了③的功能之谜,即从B2中取一个字符。紧接着,我们将MID与ROW函数结合,即从B2单元格的第1到10个字符开始,各取1个字符,这样我们就能将B2中的每一个字符逐一拆分开来。那么问题来了,如果B2的字符个数不足10个,会怎么样。简单,不足部分即为空,所以截取结果也为空。

那么片段③的返回结果是由B2的每一个字符和空值组成的数组a。

MID(B2, ②,1)={T,Y,E,B,,,,,,}

④FIND(③,A2)

这个片段是数组函数的核心。FIND函数的基本语句是FIND(要查找的子集字符串,包含子集的全集子符串)。FIND函数可以将③返回的每一个字符都在A2字符串中匹配查找,如果A2包含该字符,则返回≥1的序数值,不包含则返回# VALUE!。

这里有一个特殊情况,那就是片段③返回结果中的多余空值。有趣的是,这些多余空值并不会影响FIND的匹配,因为FIND(空值,目标字符串)始终返回1。

因此,只有当B2中的某个字符不包含在A2中,FIND函数才返回错误值,其余情况均返回指定序数值。即,片段④返回结果为10个由正整数或# VALUE!组成的一维数组b。

FIND(③, A2)={8,7,…# VALUE,…1,1,…}

⑤COUNT(④)=10

COUNT函数是返回数值型数字个数的计数函数,它在计数过程中,仅对数值进行计数,自动忽略错误值、文本、逻辑值和空值。我们正是利用了COUNT函数忽略错误值这一特性,使得片段COUNT(④)返回④中序数值的个数。当且仅当④中含有# VALUE!,计数结果小于10,其余情况下,计数结果都等于10。紧接着,我们用=10来做一个逻辑判断,计数结果等于10返回TRUE,否则返回FALSE。

也就说,只有当B2中不包含A2字符串以外的字符,FIND函数才不会返回错误值# VALUE!,此时COUNT计数结果才能等于10,逻辑判断才能为TRUE。

STEP 03 复盘全局

分析理解了各个片段的过程,我们需要再将这些逻辑运算片段串联起来,形成完成的计算逻辑。让我们结合流程图来回顾下求解过程。

1,利用ROW函数返回一组1到n的有序数组;

2,利用MID函数进行颗粒化,将子集字符串拆分成多个单一字符或空值组成的1* n的数组a;

3,利用FIND函数逐一匹配数组a中的每一个字符在全集字符串中出现的位置,返回一组由正整数和错误值组成的1*n的数组b;

4,利用COUNT函数忽略错误值计数的特点,通过判断计数结果是否为n来推断子集中是否包含全集字符串以外的字符,从而完成乱序包含问题的求解。

C2的公式计算过程如下

3dff32c45e7762bde22451e9219cfae4.png

C3的公式计算过程如下

971530ed52ab01d916e6bfd3aac2c4fe.png

以上,就是复杂的COUNT+ FIND+ MID+ ROW嵌套数组公式的详细讲解。或许公式本身并不常见,但是其中蕴含的运算逻辑却经常被运用。纵观当下Excel教程文章,热衷于分享各式函数用法的,车载斗量;而真正认真讲解各中道理的却寥若晨星。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值