在单元格中搜索子字符串并返回矩阵的值

时间:2017-12-15 14:23:31

标签: excel string excel-vba substring excel-2010 vba

给出了以下excel表:

Sheet01
字符串:A
输出:B

+---------------------+--------------+
|       String        |    Output    |
+---------------------+--------------+
| ABC Test01          | It is Test01 |
| DEF Test01          | It is Test01 |
| Test01 GHI          | It is Test01 |
| Hellow Test02 World | Wow Test02   |
| Test02 Sum Sing     | Wow Test02   |
+---------------------+--------------+

Sheet02
搜索标准:A
输出:B

+-----------------+--------------+
| Search Criteria |  OutputThis  |
+-----------------+--------------+
| Test01          | It is Test01 |
| Test02          | Wow Test02   |
+-----------------+--------------+


所以基本上我想知道Sheet02中 String 中是否可以找到Sheet02中的搜索条件
如果是这样,请在 OutputThis (Sheet02)的输出(Sheet01)值中显示。

以下作品完全匹配:

=INDEX(Sheet02!B:B,MATCH(A2,Sheet02!A:A,0))

现在我只是尝试放入一个没有任何意义的运算符。因为excel现在无法在搜索条件中找到String的哪一部分。

我正在寻找的东西是

=New_Function(SearchCriteriaMatrix, SearchCell, OutputMatrix)


修改

我刚刚使用了以下代码,它以某种方式工作:

=INDEX(Sheet02!B:B,Match(A2,Sheet02!A:A,-1))
关键是" -1"。它会将标准从完全匹配更改为广泛匹配。至少这是我想要它做的,但它并没有很好的锻炼。也许有人可以使用它并提供帮助。

2 个答案:

答案 0 :(得分:1)

SEARCHFIND可以在字符串中找到子字符串。如下所示:

=LOOKUP(2,1/SEARCH(srchCritTbl[Search Criteria],A2),srchCritTbl[OutputThis])

会奏效。

我把你的sheet2表变成了一个真实的"表和我使用结构化引用,但它也可以使用离散引用,但引用应该只包含数据表的活动部分,而不是整个列。

以下是显示结果的屏幕截图:

enter image description here

如果要对Sheet02上的表使用直接引用,它将如下所示:

=LOOKUP(2,1/SEARCH(Sheet02!$A$2:$A$3,
Sheet01!$A2),Sheet02!$B$2:$B$3)

这种方式有效:

  • SEARCH返回一个数字或错误的数组,具体取决于是否在表1中的引用单元格中找到table2的内容。
  • 1/Search(...将返回错误或某个必须不大于1的数字。
  • 2中使用LOOKUP作为查找条件可确保其大于lookup_vector中返回的任何值。
  • 如果LOOKUP函数找不到lookup_value,则该函数匹配lookup_vector中小于或等于lookup_value的最大值。 编辑:正如@Gregory指出的那样,如果lookup_vector按升序排序,则适用。如果不是,那么小于或等于lookup_value的最后一个条目将匹配。
  • 由于result_vector引用了OutputThis列,因此将返回该列中的匹配条目。

在这种情况下,人们还可以保证lookup_value使用非常大的数字,lookup_vector大于1/...中的任何值,并取消=LOOKUP(9.9E+307,SEARCH(srchCritTbl[Search Criteria],Sheet01!$A2),srchCritTbl[OutputThis]) 部分:

      4                               
    /   \       
   2      6    ---------> output of DLL: 4<->2<->1<->3<->6<->5<->7.         
 /  \     / \                         
1    3   5   7       

我习惯使用另一种形式,因为它通常更有用。

答案 1 :(得分:0)

这是一个单元格数组公式:

  1. 在单元格Sheet01!B2中输入:
    =INDEX(Sheet02!B:B,MATCH(1,IF(ISERROR(SEARCH(Sheet02!A:A,A2)),0,1),0))
  2. 按ctrl + shift + enter键将公式作为单细胞数组公式完成
  3. 将此单元格复制到剩余范围Sheet01!B3:B6

注意:它提供匹配的第一个Sheet02搜索条件的输出,而不是字符串中找到的第一个。{1}}搜索条件的输出。因此字符串Test02 and Test01将输出It is Test01,因为Test01列在Test02 Sheet02之前。