我有一个带有费用的 excel 文件(花费的金额在一列中),在下一列中我有简短的描述,主要由多个单词组成。我想“简化”描述并为每个描述分配一个或两个单词,这些单词将位于它旁边的另一列中。问题是描述不“统一”,例如我可以有“商务午餐”,“XXX餐厅的商务晚餐”,“记者咖啡”等字符串,我想分配这些描述“食物“ 标签。也有遵循类似模式的不同类别。
我的想法是创建另一个表格(在不同的工作表上) - 在一个列中我有诸如“咖啡”、“午餐”、“晚餐”之类的关键字,在旁边的列中我标记了我想要分配的标签,即“食物” ”。我使用了近似匹配的 vlookup 函数,但它返回了不正确的结果。出于某种原因,列表中单词的顺序似乎会影响结果,即使存在部分匹配(完全匹配字符串的一个单词),vlookup 也会忽略它并返回其他内容。例如,我有“在 xxx 旅馆停车”,在表中我有“停车”-“旅行费用”对,vlookup 返回“食物”标签。
你能帮我解决这个问题吗?(您有什么不同的建议吗?)
你想要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
我看不出你有任何理由使用它。
| 归档时间: |
|
| 查看次数: |
39945 次 |
| 最近记录: |