你想要FIND()
和/或SEARCH()
功能。用法:
FIND(find_text, within_text)
返回
第二个文本字符串中第一个文本字符串的起始位置(从位置1开始)
因此FIND("lunch", "lunch with customer")
返回1,并FIND("lunch", "business lunch")
返回10.如果在第二个字符串中找不到第一个字符串,则返回#VALUE!
错误值。
SEARCH()
就像是区分大小写FIND()
的事实FIND()
而SEARCH()
不是。所以
FIND("lunch", "Lunch with customer")
返回#VALUE!
但
SEARCH("lunch", "Lunch with customer")
返回1
我假设你会想要使用SEARCH()
,不区分大小写的。
你需要设置一个这样的数组:

在单独的表格中这样做可能更好; 我们称之为Key-Sheet
。然后,在您的数据表上:如果您的自由格式描述在列中A
(从单元格开始A1
),请在单元格中输入以下内容B1
:
=MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$7,$A1),LEN($A1)+1)), SEARCH('Key-Sheet'!$A$1:$A$7,$A1))
并按Ctrl+ Shift+ Enter,使其成为“数组公式”。(它将显示在大括号中的公式栏中。)说明:
SEARCH('Key-Sheet'!$A$1:$A$7,$A1)
- 对于每个关键字列A
中的关键字(“咖啡”,“午餐”,“晚餐”等...),A
在数据表的当前行,列的描述中搜索它(例如,“商务午餐” “)。这将创建一个数组包含{ #VALUE!
; 10
; #VALUE!
; ...}(七个元素(在本例中),每个关键字一个;第二个显示“午餐”的结果,即“午餐” 'Key-Sheet'!A2
。
IFERROR(…,LEN($A1)+1)
- 将#VALUE!
值替换15
为LEN("business lunch")+1
,可能不是有效的返回值SEARCH()
(实际上,它高于任何可能的有效返回值SEARCH()
),但这是有效数字。所以现在我们的数组是{ 15
; 10
; 15
; ......}。
MIN(…)
- 从数组中提取最小值:在本例中,10
。一般来说,这将是(第一次)成功回归SEARCH()
。
=MATCH(…, …)
- 请注意,第二个参数与MATCH()
上面的第一个项目符号相同。所以我们正在寻找10
数组{ #VALUE!
; 10
; #VALUE!
; ......}。这将返回2的位置10
,对应于A1
数据表(“商务午餐”)中包含“午餐” 的事实,该午餐位于密钥表的第2行。
要获得费用类别,只需将索引编入B
密钥表的列即可。将单元格设置C1
为=OFFSET('Key-Sheet'!$B$1,B1-1,0)
。(这不需要是数组公式。)

注意(如上所述),如果费用说明包含多个关键字,则只会找到第一个关键字。
如果您不想打扰中间值,则可以进行计算
=OFFSET('Key-Sheet'!$B$1,MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$6,$A1),LEN($A1)+1)),SEARCH('Key-Sheet'!$A$1:$A$6,$A1))-1,0)
这确实需要是一个数组公式。
PS FIND()
和SEARCH()
函数有一个可选的第三个参数:
SEARCH(find_text, within_text, [start_num])
所以
SEARCH("cigar", "Sometimes a cigar is just a cigar.")
返回13
但
SEARCH("cigar", "Sometimes a cigar is just a cigar.", 17)
返回29
我认为没有理由让你使用它。