我有一个电子表格,它使用命名范围来维持动态控制。我有一个搜索框,用户输入文本(可以是数字,但单元格格式为一般)。当用户输入数字时,LOOKUP()公式将在指定范围内搜索该数字并返回任何数据。以下是概述:
A B C
----------------------------------------------------
1 |Search: 232 <- user input (Named rnge: SearchTerm)|
----------------------------------------------------
2 | Assc: .... |
----------------------------------------------------
3 | Phone: ... |
----------------------------------------------------
LOOKUP()范围,我们称之为Table1,如下所示:
-------------------------------------------
| Associate | Rooms | Phone Number |
--------------------------------------------
| John Doe | 110-130 | xxx-xxx-xxx |
--------------------------------------------
| Jane Doe | 131-150 | xxx-xxx-xxx |
--------------------------------------------
| Etc... |
--------------------------------------------
我已成功设法使用LOOKUP()找到一个单元格,但不是动态范围内的单元格。我当前的公式也使用了很多IF()/ AND()/ OR()语句,因此它比必要的时间更长。我目前看到的方式,如果用户输入值介于这两个数字之间并不漂亮,我一直在使用LEFT()来获取第一个数字和RIGHT()以获得最正确的数字。我甚至使用MAX()和其他函数(如SUBSTITUTE()等)一起玩,但我的功能太长并经常导致错误,因为它差不多有4行。哎哟......我知道。有没有更简单的方法来查看是否为相关人员分配了在搜索框中输入的房间,没有VBA,而不是我的长IF / AND / OR语句公式?具体来说,寻找:B2
这就是我所提出的,就像我说的那样,找到了一个特定单元格的解决方案(C5是Table1&在Rooms列下的第一行),但是我需要它来查找数字适合自主:
=IFNA(IF(AND(SearchTerm>=NUMBERVALUE(LEFT(C5,3)),SearchTerm<=NUMBERVALUE(RIGHT(C5,3))),OFFSET(C5,0,-1,1,1),LOOKUP(1E+307,FIND(" "&SearchTerm&","," "&Table1[Misc Rooms]&","),Table1[Associate])),"NO MATCHES FOUND")
从LOOKUP开始,公式指的是与问题无关的数据。公式检查搜索到的房间是否在关联区域内(列&#39;房间&#39;),如果没有,则查看其是否通常不在关联区域中的错误分配的房间
TL; DR 什么是最有效的公式,看看一个数字是否在一个带连字符的数字(作为文本输入)和使用LOOKUP()/ VLOOKUP()/ INDEX()/ MATCH()等返回它旁边的列之间,真的不是VBA。寻找B2 =
答案 0 :(得分:1)
考虑在Room列中只使用一个数字。或者使用first room
和last room
作为两个不同的列。然后,您可以使用近似匹配,该匹配将返回小于或等于搜索值的匹配值。查看Vlookup的帮助或匹配1或TRUE作为最后一个参数。
该表必须按first Room
按升序排序。
=INDEX(Table1[Associate],MATCH(A8,Table1[first Room],1))
修改:如果无法拆分列,请考虑以下事项:
选项2公式:此选项需要按第一个房间号码递增排序数据,房间号码不应有任何空白。结果的示例在单元格E3中,指的是在D3中输入的数字:
=INDEX(Table1[name],MATCH(D3,INDEX(LEFT(Table1[room],FIND("-",Table1[room])-1),0)+0,1))
这是一个数组公式,必须使用 Ctrl + Shift + Enter 确认。
选项3公式:使用此公式,“房间”列中的数据将按原样显示。订单并不重要。唯一的条件是只有一个短划线分隔数字,没有其他字符。该公式在单元格E4中使用,指的是在D4中输入的数字。不是数组公式,只需按 Enter :
=LOOKUP(2,1/((D4>=LEFT(Table1[room],FIND("-",Table1[room])-1)+0)*(D4<=MID(Table1[room],FIND("-",Table1[room])+1,99)+0)),Table1[name])
编辑2:选项3的说明
LOOKUP(2,1/(comparison),ResultRange)
- 比较解析为TRUE或FALSE值列表。通过比较结果除1将得到1为TRUE,#DIV / 0错误为FALSE值。查找2将查找结果列表中的最后1个,并从ResultRange中的相同位置返回其等效值。
将两个比较与逻辑AND结合起来可以通过将比较结果相乘来实现,比较结果将分解为单个TRUE / FALSE值列表,即LOOKUP(2,1/((comparison1)*(comparison2)),ResultRange)
列room
包含文字。拼接数字仍然会将数字作为文本返回。用户输入的搜索词是实数。这两种数据类型永远不会匹配,因此我们需要将输入的数字转换为文本或将拼接的文本转换为实数。由于我们检查的数字大于或小于某个数字,我们需要两种数据类型作为数字。因此,我们需要将拼接的文本转换为数字。这可以通过对文本应用计算来完成,例如添加零,因此+0。如果您确定所有数字都是正数,也可以使用乘法1。