在Excel中带减号的查找function的说明

在search从字母数字string中提取数字的解决scheme时,我在MrExcel论坛中偶然发现了以下公式。 我很难理解公式中的LOOKUPRIGHT函数前面减号符号的作用。 公式给出为

 =-LOOKUP(1,-RIGHT(TRIM(LEFT(D1,FIND("g/L",D1)-1)),{1,2,3,4,5,6})) 

有人可以向我解释什么是公式,为什么有减号?

TL; DR

简单的答案是减号乘以-1

  • 首先通过RIGHT函数返回的数组中的项来故意生成#VALUE! 数组中的错误(因为string不能相乘)和

  • 第二,要扭转候选人从LOOKUP公式中得到答案的事实 – 数组中的数字 – 现在是负数,但是在整个公式评估之后需要积极。

MrExcel原始问题

OP在该论坛上问道:

寻求帮助,找出最佳配方,从可变长度的字母数字string中提取VOC含量值。 VOC含量是“g / L”之前的数字。

而一个数据样本是:

SEALANT-RETAINING COMPOUND SINGLE COMPONENT ANAEROBIC, SCR40372A, *Loctite 242, 10 ML BOTTLE,146 g/L VOC

SEALANT-THREAD LOCK *HIGH STR *MIL-S-22473 *GRADE AA *50 ML BOTTLE * * *SCR802269A\ * Loctite 089 Weld Sealant125.3 g/L VOC

他们想要的答案是146125.3

在这个线程中,一个回答者(pgc01)发布这个公式:

=-LOOKUP(1,-RIGHT(TRIM(LEFT(D1,FIND("g/L",D1)-1)),{1,2,3,4,5,6}))

(其中D1将包含该string)

简单的例子

原始线程正在寻找从占位符为g/L的未知长度的string中提取未知长度的数字值。 把它放在一边,让我们简单地考虑下列string:

foobar123

foobar1234

foobar12345

挑战在哪里得到的数字部分不知道多长时间(数字不会超过6位数字)。 你不能正常使用RIGHT因为你不知道在第二个参数中放置了多less个字符。 我们不使用VBA,所以我们需要一种遍历文本的方法,找出什么是数字和非数字的string,以便我们可以将数字部分拉出来。

公式分析

所以现在你正在看的公式只是:

=-LOOKUP(1,-RIGHT("foobar123",{1,2,3,4,5,6}))

打破公式:

  • RIGHT("foobar123",{1,2,3,4,5,6}) – 在整个公式的上下文中返回结果数组r123ar123bar123bar123 。 您不能直接在Excel中看到这一点,但是如果您使用插入function向导来检查LOOKUP公式,则可以。

在这里输入图像描述

  • RIGHT函数的前面添加减号的作用是将数组的每个项乘以-1,现在给我们一个-3-23-123#VALUE!的数组#VALUE!#VALUE!#VALUE! 。 错误值的意图是因为我们现在可以推断string的数字部分是3位数字,因为任何进一步的权利给出了错误,即你不能乘以-1的字母字符,并得到一个有意义的结果。

在这里输入图像描述

  • 接下来使用LOOKUP函数在这个数组中find1即=LOOKUP(1, etc) 。 我们在数组中的所有数字结果都是负数,因此所有结果都小于LOOKUP函数将返回数组中最小的值,小于或等于查找值(见下文),在我们的例子中结果是数字最多,因此正确的“捕获”,因为我们正在从右侧searchstring的数字部分。 它暗示的行为只是跳过#VALUE! 错误。 所以,在我们的例子中,这将返回-123

来自MSDN:

数组forms

LOOKUP的数组forms在数组的第一行或列中查找指定的值,并从数组的最后一行或列中的相同位置返回一个值。 当您要匹配的值位于数组的第一行或列时,请使用此forms的LOOKUP。 如果要指定列或行的位置,请使用其他forms的LOOKUP。

提示通常,最好使用HLOOKUP或VLOOKUP函数而不是LOOKUP的数组forms。 提供这种forms的LOOKUP是为了与其他电子表格程序兼容。

如果LOOKUP找不到lookup_value,则它使用数组中的最大值小于或等于lookup_value。

如果lookup_value小于第一行或第一列中的最小值(取决于数组维数),LOOKUP将返回#N / A错误值。

  • 最后, LOOKUP函数之前的负运算符将评估结果乘以-1,得到123

testing

=-LOOKUP(1,-RIGHT("foobar123",{1,2,3,4,5,6}))123

=-LOOKUP(1,-RIGHT("foobar12345",{1,2,3,4,5,6}))给出12345

=-LOOKUP(1,-RIGHT("foobar123456789",{1,2,3,4,5,6}))给出456789 (因为RIGHT函数的第二个参数中的数组只能达到6。

=-LOOKUP(1,-RIGHT("foobar123baz",{1,2,3,4,5,6}))给出=-LOOKUP(1,-RIGHT("foobar123baz",{1,2,3,4,5,6})) #N/A因为baz位。

因此,在MrExcel的原始线程中,使用查找string中的g/L项目并以左侧作为确保某些未知数字(最多6个)最右侧字符的方式数字。

结论

有些人可能想在这一点上拿出VBA和正则expression式的工具,但是对于那些想要或者需要用公式来做所有事情的人来说,这提供了一种进行模糊匹配来识别文本数据中重要信息的方法。