你想要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
我认为没有理由让你使用它。