作者JieJuen (David)
看板Office
标题Re: [算表] VBA 查储存格内容是否包含某数,执行..
时间Sat Mar 10 01:08:10 2018
这题因为原作後来才补充的比较完整,
导致一开始的解答方向可能有些不对,
这里也提供一个解法
此问题是要查找多个可能的关键字 在更长的文句中出现的位置
比如关键字key1
出现在更长的文句contextKey1context中的位置
如果问题被拆解成这样,大家会知道是用SEARCH(不分大小写)
这里重述一下原问题的简化版(单一关键字)
输入长句contextKey1context
找出关键字key1出现在长句的位置(不分大小写)
而原版本是多关键字(→SEARCH阵列)
给定key1对应的结果result1
给定key2对应的结果result2
输入长句contextKey1context
找出关键字key1出现在长句的位置
找出关键字key2出现在长句的位置
判断出位置最前(位置最小值MIN)的关键字keyV
给出keyV对应的结果resultV
绕口令绕完了
所以结论就是MIN(SEARCH)的阵列公式
=IFERROR(INDEX($I$1:$I$7,MIN(IFERROR(IF(SEARCH($H$1:$H$7,A1)=
MIN(IFERROR(SEARCH($H$1:$H$7,A1),9^9)),ROW($H$1:$H$7)),9^9))),"没找到")
这个式子和先前的解答会有什麽不同呢?
Test 1
kettle 乐
快 乐 a 新
water 新 新 新 b 年
zip 没找到 没找到 没找到 c 年
table 新 新 新 et 快
eagle 乐 乐 乐 e 乐
flag 乐 乐 乐 f 乐
kite 乐 乐 乐 g 乐
et在原式不是答案,所以只会找到"乐"
本式中如有两个符合,会给第一个keyword,所以是"快"
Test 2
kettle
没找到 快 没找到 a 新
water 新 新 新 b 年
zip 没找到 没找到 没找到 c 年
table 新 新 新 et 快
eagle 新 新 新 ef 乐
flag 乐 乐 乐 f 乐
kite 没找到 没找到 没找到 g 乐
Test 2 更明显,原式输入kettle找不到任何答案
尽管key4是"et"
附档:
https://tinyurl.com/goo2yu/MultiSearch.xlsx
※ 引述《windknife18 (windknife18)》之铭言:
: 标题: Re: [算表] VBA 查储存格内容是否包含某数,执行..
: 时间: Tue Feb 2 11:19:27 2016
:
: 很就没有玩阵列公式了, 感觉你的问题蛮好玩的, 试了一下感觉应该对,
: 请看看是不是符合你的需求罗,档案位置
: http://file.wikidot.com/local--files/f/20160202.xlsx
:
: 以A1摆放英文字, B1来表示公式, 主要想法:
: 1. H:J 栏摆放对照表
: 2. 用mid将A1的英文字切割成一个一个的字元
: 3. 和H栏的英文字母比对看是否有一样的
: 4. 找出最先出现的位置
: 5. 找出最先出现的位置的英文字母
: 6. 用index找出相对英文字母的中文字
:
: B1=IF(A1="","",IF(MIN(IF((MID(A1,ROW($1:$100),1)=TRANSPOSE($H$1:$H$7)),
: (ROW($1:$100))))=0,"没有找到",INDEX(I:I,MAX(IFERROR(TRANSPOSE(ROW($1:$100))
: *((MID(A1,ROW($1:$100),1)=TRANSPOSE($H$1:$H$7))*(ROW($1:$100))=MIN(
: IF((MID(A1,ROW($1:$100),1)=TRANSPOSE($H$1:$H$7)),(ROW($1:$100))))),0)),1)))
:
: PS. 记得输入玩,按Ctrl+Shift+Enter结束, 没时间优化罗 ^_^
:
:
:
: ※ 引述《rd2l4 (唉呦就是那个啊~~)》之铭言:
: : 软体: EXCEL
: : 版本: 2010
: : A B
: : 1 [输入] [查找结果]
: : 2
: : 3
: : 目标是希望输入(A1)之後可以出现(B1)不同结果(有不论大小写的中英组合)
: : 举例来说,这是目标表:
: : ┌────┬────┐
: : │ 查找 │ 结果 │
: : ├────┼────┤
: : │ a │ 新 │
: : ├────┼────┤
: : │ b OR c │ 年 │
: : ├────┼────┤
: : │ d │ 快 │
: : ├────┼────┤
: : │ e-g │ 乐 │
: : └────┴────┘
: : 实际输入可能是:apple,结果B1是出现"新"(a先出现)
: : 若是:banana,B1就是"年" (b先出现)
: : 目前规划是Worksheet_Change + application.vlookup?search?find?还是IF?
: : 可能是我找错方向了,google都找不到类似的东西...
: : 感觉又很简单可是却卡住了QQ
: : 在一般搜寻中只要加个*明明就可以的VBA却不行Orz
: : 求救 T_T 谢谢
原作补充:
不好意思如果还是有问题T_T
1. 因为输入的内容不一定在第一个,他可能是watermelon,判定成新
(a先出现了,但在第二个)
2. 因为判定的内容并不单纯是单个字母,可能是xxx
举例来说:Tim 或 Tom 是否可以把他判定成不同物件?
按照目前的状况继续写T会判定成同一个...
谢谢!
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.131.84.79
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1454383170.A.211.html
: → soyoso: 想到的是=IFERROR(VLOOKUP(MID(A1,MIN(IF(MID(A1,ROW($1:$ 02/02 12:23
: → soyoso: 100),1)=TRANSPOSE($H$1:$H$7),ROW($1:$7))),1),H:I,2,0), 02/02 12:24
: → soyoso: 0),"没有找到") 02/02 12:24
: → soyoso: https://goo.gl/Nyh9pm 02/02 12:26
: → windknife18: S大实在太厉害,这样简单多了 ^_^ 02/02 12:46
: 推 rd2l4: 谢谢两位大大!! 02/02 14:09
--
如连结失效,请试q我名片,目前版本:
Excel 附档
https://sites.google.com/a/2yu.co.cc/www/ (含连结失效档案)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.231.152.24
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1520615301.A.343.html
1F:→ soyoso: 想到是=IFERROR(INDEX(I:I,RIGHT(MIN(IFERROR(SEARCH(H$1: 03/10 13:19
2F:→ soyoso: H$7,A6)*10^9+ROW($1:$7),99^9)),9)),"没找到") 03/10 13:19
4F:→ JieJuen: 推推~! ^^ 03/11 21:07