我试图编写Excel函数,从长字母数字字符串中提取任何N位数字。我在几个地方(1,2)在网上找到了一个有效的示例,但我无法弄清楚如何。
例如,给定字符串0xabc_2014528888_abcde_30285_q!
,函数应返回2014528888
(假设N = 10)。
我在几个地方找到了以下Excel代码段(此处为N = 10):
=LOOKUP(10^10,MID(A1,ROW(INDIRECT("1:"&LEN(A1)-9)),10)+0)
但我无法理解它是如何运作的。
Microsoft的LOOKUP() function documentation说LOOKUP()
的第一个参数是查找值...如何将该值设置为10 ^ N返回N个字符?
INDIRECT()
函数似乎正在获取参数1:21
(在我的示例字符串中)。这是一个有效的细胞参考?如果我单独在单元格中输入它,它就不会计算任何合理的东西。
有人可以解释这个函数在提取数字序列方面做了些什么吗?
答案 0 :(得分:0)
我会给出一个镜头,虽然有些部分我不确定。
基本上,我们这里有一个数组公式,它不是作为数组输入的 - 也就是说,当给定一系列值时,它将为每个可能的值执行其功能,而不是为整个范围一次。
INDIRECT("$1:$22")
会返回对所有行1
到22
的引用。 ROW
函数然后使用对这些行的引用来返回列表或数组(这是我不确定的部分 - 我不确定它是如何创建数组的数字{1;2;3;4;5;6;7;8;9;...22}
然后使用MID
从源值返回10个字符的所有字符串,使用之前的线性数字数组作为起始点。 MID
返回另一个数组{"0xabc 2014";"xabc 20145";"abc 201452";..."e 30285 q!"}
。然后强制字符串通过+1执行数学函数。这会强制数组中包含非数字字符的任何字符串返回#VALUE!
错误,而数字字符串则将其自身返回为值。我们得到一个像{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;2014528888;#VALUE!;...}
最后,LOOKUP
查看该数组并找到小于第一个参数的最大值 - 也就是说,数组中唯一没有返回#VALUE的结果!
我怀疑 - 但无法确定 - 密钥是使用LOOKUP
而不是VLOOKUP
或任何其他数据库功能。 LOOKUP
有两种操作模式 - 矢量模式和阵列模式。我怀疑如果在阵列模式下使用,它会强制输入第二个参数的任何数据成为一个数组。