MS excel - 根据关键字分配“类别”

cgn*_*gnx 2 microsoft-excel

我有一个带有费用的 excel 文件(花费的金额在一列中),在下一列中我有简短的描述,主要由多个单词组成。我想“简化”描述并为每个描述分配一个或两个单词,这些单词将位于它旁边的另一列中。问题是描述不“统一”,例如我可以有“商务午餐”,“XXX餐厅的商务晚餐”,“记者咖啡”等字符串,我想分配这些描述“食物“ 标签。也有遵循类似模式的不同类别。

我的想法是创建另一个表格(在不同的工作表上) - 在一个列中我有诸如“咖啡”、“午餐”、“晚餐”之类的关键字,在旁边的列中我标记了我想要分配的标签,即“食物” ”。我使用了近似匹配的 vlookup 函数,但它返回了不正确的结果。出于某种原因,列表中单词的顺序似乎会影响结果,即使存在部分匹配(完全匹配字符串的一个单词),vlookup 也会忽略它并返回其他内容。例如,我有“在 xxx 旅馆停车”,在表中我有“停车”-“旅行费用”对,vlookup 返回“食物”标签。

你能帮我解决这个问题吗?(您有什么不同的建议吗?)

Sco*_*ott 9

你想要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))
Run Code Online (Sandbox Code Playgroud)

然后按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(…, …)– 请注意,第二个参数 toMATCH()与上面的第一个项目符号相同。所以我们10在数组中寻找{ #VALUE!; 10; #VALUE!; ... }。这将返回 的位置10,即 2,对应于A1数据表(“商务午餐”)上包含“午餐”的事实,它位于 Key-Sheet 的第 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)
Run Code Online (Sandbox Code Playgroud)

确实需要是一个数组公式。


PSFIND()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

我看不出你有任何理由使用它。