Excel公式技巧:同时定位字符串中的第一个和最后一个数字( 二 )


在前面的一系列文章中 , 我们已经找到了一种非常合适的方法来确定字符串中第一个数字的位置 , 即MIN/FIND函数组合构造 。然而 , 找到一种等效的用于确定字符串中最后一个数字的结构并不容易 , 能够实现这一点是关键 。
对于MID函数的参数num_chars:
=MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1/17)),[someconstruction])
假设希望避免[some construction]由两个单独的子句进行减法运算 , 其中一个是字符串内第一个数字的位置 , 另一个是最后一个数字的位置 。我们首先查看一些确定字符串中最后一个数字的位置的公式结构 , 然后查看其中的哪一个(如果有的话)也可能有助于发现第一个数字的位置 , 这可能会很有用 。下面是实现此目的的3种主要的公式结构:
公式1:
=MATCH(1,0/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)))
公式2:
=LOOKUP(1,0/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)),ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))))
公式3:
=MAX(IF(ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)),ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)))))
其中 , 公式1和公式3是数组公式 。
显然 , 最好的是公式1 , 因为它不需要重复ROW子句 。但是 , 这样的构造还可以用于查找字符串中的第一个数字吗?如果不行 , 公式2可以吗?公式3呢?
我们先尝试减法运行 , 即使用确定最后一个数字位置的子句减去用于确定第一个数字位置的子句:
MATCH(1,0/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)))-MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1/17))
从而构成解决方案:
=MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1/17)),1+MATCH(1,0/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)))-MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1/17)))
不错!但是 , 可以改进参数num_chars的构造吗?
一种方法是对上面给出的公式3:
=MAX(IF(ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)),ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)))))
进行微小的调整 。在2010年及以后的版本中 , Excel提供了AGGREGATE函数 , 它不仅可使许多数组(CSE)结构转换为非CSE , 而且还具有标准的CSE公式无法复制的其他优点 。
与公式3等价的使用AGGREGATE函数的公式为:
=AGGREGATE(14,6,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)))/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)),1)
我们可以利用其来不只生成最大值或最小值 , 而是生成包含这两个值的数组 。因此 , 构造公式:
=MMULT(AGGREGATE({14,15},6,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)))/ISNUMBER(0+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1)),1),{1;-1})
转换为:
=MMULT({25,13},{1;-1})
其中的13和25分别代表字符串中第一个和最后一个数字的位置 。
但是 , 其仍有一点缺陷 , 就是需要重复ROW结构 。我们能否对此进行改进 , 找到不需要重复子句的公式构造?是的 , 可以使用:
MATCH(“*”,T(1/(1+MID(A1,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1))),1))),{1,0})
这类似于AGGREGATE的结构 , 将一个数组传递给其参数 , 得到两个结果组成的数组 。上面的公式转换为:
MATCH(“*”,T(1/(1+{“A”;”c”;”c”;”o”;”u”;”n”;”t”;””;”N”;”o”;”.”;””;”1″;”-“;”2″;”3″;”4″;”-“;”5″;”6″;”7″;”8″;”-“;”9″;”0″;””;”r”;”e”;”q”;”u”;”i”;”r”;”e”;”s”;””;”a”;”t”;”t”;”e”;”n”;”t”;”i”;”o”;”n”})),{1,0})

推荐阅读