在Excel中带减号的查找function的说明
在search从字母数字string中提取数字的解决scheme时,我在MrExcel论坛中偶然发现了以下公式。 我很难理解公式中的LOOKUP
和RIGHT
函数前面减号符号的作用。 公式给出为
=-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
他们想要的答案是146
或125.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})
– 在整个公式的上下文中返回结果数组r123
,ar123
,bar123
,bar123
。 您不能直接在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式的工具,但是对于那些想要或者需要用公式来做所有事情的人来说,这提供了一种进行模糊匹配来识别文本数据中重要信息的方法。