手机版

Excel公式技巧:从字符串中提取数字——字符串开头的数字

时间:2021-09-28 来源:互联网 编辑:宝哥软件园 浏览:

Excel公式技巧:从字符串中提取数字。——数字在字符串的开头。

本文主要研究从字符串开头提取数字的技术:

1.这些数字是连续的。

2.这些连续的数字位于字符串的开头。

3.期望的结果是将这些连续的数字返回到单个单元格。

对于下面研究的每个解决方案,我们需要在两种不同的情况下测试其可靠性:

1.除了开头,字符串中没有数字,例如123公元前。

2.字符串中除开头之外都有数字,要么在末尾,要么在中间,如123ABC456或123ABC456DEF。

不管字符串中除了开头之外是否还有其他数字,一些要研究的解都会很好用,但是有些解是有局限性的。在分析每种解决方案时,都会明确说明。

查找并向左

公式1:

=-LOOKUP(1,-LEFT(A1,ROW(INDIRECT("1:" LEN(A1)))))

如果单元格A1中的内容为“123ABC”,则上述公式1返回“123”。解决过程如下:

行(间接(“1:”透镜(A1))

生成由1到单元格A1中字符串长度的整数组成的单列数组:

{1;2;3;4;5;6}

因此,等式1变成:

=-LOOKUP(1,-LEFT(A1,{ 1;2;3;4;5;6}))

因为LOOKUP强制生成数组,所以这里LEFT返回一个由六个值组成的数组,而不是一个值,每个值对应于一个字符串,在该字符串中LEFT的num_chars参数被指定为1、2、3、4、5和6,即:

=-LOOKUP(1,-{“1”;)12;"123; "123 a”;123AB”公元前123年" })

将数组乘以-1得到:

=-LOOKUP(1,{-1;-12;-123;#VALUE!#VALUE!#VALUE!})

关于LOOKUP,如果在lookup_vector中找不到lookup_value,并且假设lookup_vector中没有大于lookup_value的值,则函数将返回lookup_vector的最后一个值(在本例中是一个数字)。该函数还会忽略lookup_vector中任何不正确的值。这就是为什么我们开始给lookup_vector中的值添加负号(通过创建一个由负数、零(如果要提取的字符串以0开头,例如0123ABC)或错误值组成的数组),这可以确保lookup_value为1始终是一个完整且合法的选择。这里,因为在lookup_vector中找不到1,所以公式返回数组中的最后一个值,即-123。

当然,这绝对不是处理这个公式结构的唯一方法,只要确保lookup_value所选的值足够大。其实这并不难。让lookup_value使用所谓的“大数”(即9.9999999999e307,这是Excel中允许的最大正数)来确保此公式构造有效。或者,有些人喜欢只取“非常大”的值,比如10 ^ 10(它的优点是看起来不像“大数”那么笨拙)。

因为公式1中的LOOKUP函数返回-123,所以在它之前添加一个负号,使它成为所需的123。

然而,公式1并不可靠。因为有些字符串可能会返回其他结果,例如,单元格中的值是12JUN,那么:

=-LOOKUP(1,-LEFT(A1,ROW(INDIRECT("1:" LEN(A1)))))

转换为:

=-LOOKUP(1,-LEFT(A1,{ 1;2;3;4;5}))

转换为:

=-LOOKUP(0,-{“1”;)12;“12J”;“12JU”;“12JUN”})

此时,它将被转换为:

=-LOOKUP(0,{-1;-12;#VALUE!#VALUE!-43994})

这是因为当“12JUN”被强制转换为数字时,Excel认为是日期“2020年6月12日”,所以将其转换为相应的序列号。此时,LOOKUP函数返回-43994。

当然,这不是唯一会发生的字符串。事实上,它会发生在任何可以被Excel解释为日期的字母数字字符上,如09月30日、01月2日等。这也会导致不正确的结果。

另外,公式1对于123E3等字符串也是无效的,结果会是123000。正常情况下,在单元格中输入123E3后,Excel会自动转换为科学计数格式。

向左数

等式2:

=0 LEFT(A1,COUNT(0 MID(A1,ROW(间接(“1:”LEN(A1)),1))

这是一个数组公式。

仍然将单元格A1中的数据作为“123ABC”。公式2可以转换为:

=0 LEFT(A1,COUNT(0 MID(A1,{ 1;2;3;4;5;6},1)))

转换为:

=0 LEFT(A1,COUNT(0 {“1”;)2;"3; "一个“;”b ";"C"}))

转换为:

=0 LEFT(A1,COUNT({ 1;2;3;#VALUE!#VALUE!#VALUE!}))

COUNT函数忽略错误值,并获取:

=0左(A1,3)

结果是:

123

接下来,尝试公式2,看看除了字符串的开头,其他地方是否有数字。例如,如果单元格A1中的数据是“123ABC45”,公式2可以转换为:

=0 LEFT(A1,COUNT(0 MID(A1,{ 1;2;3;4;5;6;7;8},1)))

转换为:

=0 LEFT(A1,COUNT(0 {“1”;)2;"3; "一个“;”b ";"c ";"4;"5}))

转换为:

=0 LEFT(A1,COUNT({ 1;2;3;#VALUE!#VALUE!#VALUE!4;5}))

转换为:

=0左(A1,5)

转换为:

=0 "123AB "

结果是:

#VALUE!

原因是字符串末尾还有其他数字,所以count函数COUNTed的数字个数大于字符串开头的数字个数,所以LEFT值仍然是字母和数字混合的字符串。

左,匹配和是数字。

等式3:

=0 LEFT(A1,MATCH(FALSE,ISNUMBER(0 MID(A1,ROW(INDIRECT("1:" LEN(A1)),1)),0)-1))

这是一个数组公式。

单元格A1中的数据为“123ABC”,公式3可转换为:

=0 LEFT(A1,MATCH(FALSE,is number({ 1;2;3;#VALUE!#VALUE!#VALUE!}),0)-1)

如果是错误值,ISNUMBER函数返回FALSE,因此上述公式可以转换为:

=0 LEFT(A1,MATCH(FALSE,{ TRUE真;真;假;假;FALSE},0)-1)

转换为:

=0左(A1,4-1)

转换为:

=0左(A1,3)

结果是:

123

在公式3中,MATCH/ISNUMBER组合确保字符串中除开头之外的数字不会影响最终结果。例如,如果单元格A1中的数据是“123ABC45”,公式3可以转换为:

=0 LEFT(A1,MATCH(FALSE,is number({ 1;2;3;#VALUE!#VALUE!#VALUE!4;5}),0)-1)

转换为:

=0 LEFT(A1,MATCH(FALSE,{ TRUE真;真;假;假;假;真;真},0)-1)

转换为:

=0左(A1,4-1)

转换为:

=0左(A1,3)

结果是:

123

左,匹配和ISERR。

与公式3的构造一致,唯一的区别是用ISERR函数代替ISNUMBER函数,强制返回一个由数字组成的数组。

等式4:

=0 LEFT(A1,MATCH(1,0 ISERR(0 MID(A1,ROW(INDIRECT("1:" LEN(A1)),1)),0)-1))

这是一个数组公式。

单元格A1中的数据为“123ABC”,公式4可转换为:

=0 LEFT(A1,MATCH(1,0 ISERR({ 1;2;3;#VALUE!#VALUE!#VALUE!4;5}),0)-1)

转换为:

=0 LEFT(A1,MATCH(1,0 { FALSE;假;假;真;真;真;假;FALSE},0)-1)

转换为:

=0 LEFT(A1,MATCH(1,{ 0;0;0;1;1;1;0;0},0)-1)

转换为:

=0左(A1,4-1)

转换为:

=0左(A1,3)

结果是:

123

和公式3一样,除了开头的数字之外,字符串其他部分中数字的存在不会影响结果。

版权声明:Excel公式技巧:从字符串中提取数字——字符串开头的数字是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。