Excel:检查列中是否存在单元格string值,并获取该string的所有单元格引用

我怀疑这可能是VBA的工作,这是超出我的能力。 但是这是一个场景:

工作表1(CAS1)中的列A包含x行文本值

工作表2中的列A(CAS2)包含x行文本值

A部分 – 对于CAS1中的每个行值,我需要知道该string是否包含在CAS2中的任何单元格中。 不完全匹配,string可能只是search单元格的一部分。

B部分 – 我需要知道包含CAS1值的CAS2中每个单元格的单元格值(如果它们确实存在,它们可以列在与CAS1中search的单元格相邻的单元格中)。

我尝试了以下尝试A部分,都无济于事:

vlookup(A1,sheet2!A:A,1,false) NOT(ISNA(MATCH(A1,sheet2!A:A,0))) ISNUMBER(MATCH(A1,sheet2!A:A,0)) COUNTIF(sheet2!A:A,A1)>0 IF(ISERROR(MATCH(A1,sheet2!A:A, 0)), "No Match", "Match") 

我知道CAS2中的一些单元格值包含CAS1中的单元格值,所以我不知道他们为什么返回false或No Match。 我怀疑这可能归结于文本内容的性质。 所以这里有一些示例数据:

CAS1

 LQ056 RV007H RV008 RV009H TSN304 TSN305 

CAS2

 RV009-satin-nickel-CO.jpg STR314.jpg STR315.jpg HCY001.jpg RV008-oval-rad-CO.jpg HCY001-BRAC006.jpg 

任何帮助,将不胜感激。

这个问题可以通过VBA来解决(至less,我想象的是VBA解决scheme比可能的Excel更容易)。 您需要一个macros,对于CAS1中的每一行,searchCAS2的每一行中的内容并返回您的地址。

 For Each cell In Sheets("CAS1").Range("A1:A" & Sheets("CAS1").Range("A1").End(xlDown).Row) '<-- check each cell of the range A1:A? of sheet CAS1 (adapt "A" and "1" if they're different) recFound = 0 '<-- count how many findings there are For Each cell2 In Sheets("CAS2").Range("A1:A" & Sheets("CAS2").Range("A1").End(xlDown).Row) '<-- check in each cell of the range A1:A? of sheet CAS2 (adapt "A" and "1" if they're different) If InStr(cell2.Value, cell.Value) <> 0 Then '<-- if the value in cell is contained in the value in cell2.. recFound = recFound + 1 '<-- account the new finding cell.Offset(0, recFound) = Split(cell2.Address, "$")(1) & Split(cell2.Address, "$")(2) '<--write the address on the right of the currently searched cell End If Next cell2 Next cell 

以上所有应该被包含在一个macros,如Sub makeMySearch() ,应该运行得到结果。 正如我的代码中评论的,我假设数据在A1:A? 两张纸; 但他们当然可能是,例如,在B5:B? 在纸张1和C7:C? 2.您需要清楚地将代码调整为您当前的数据。

不需要VBA。 一些简单的数组公式可以完成这项工作。

要查看CAS1中的条目是否存在于CAS2中:

 =OR(ISNUMBER(SEARCH(A2,CAS2_))) 

将返回TRUE或FALSE。 但是这个公式必须通过按住CTRL-SHIFT键的同时按下ENTER键来input。如果你正确地做到了这一点,Excel会在你能在公式栏中看到的公式放置大括号{…}

SEARCH函数返回一个结果数组,它将是#VALUE! 错误或数字。

为了返回地址,可以在CAS1中的一个单元格附近input下面的数组公式

 =IFERROR(ADDRESS(LARGE(ISNUMBER(SEARCH($A2,CAS2_))*ROW(CAS2_),COLUMNS($A:A)),1),"") 

向右填充可能的最大地址数量,然后select组并填写。

在这种情况下,返回的数组是一个0或1 *行号(即行号)的string。 我假设CAS2中的数据在列A中,但是如果需要,可以更改列号(如果需要,甚至可以通过用COLUMN(CAS2_)replaceADDRESS函数中的1来计算它)

CAS1_和CAS2_是命名范围,或者是对这两个文本组的绝对范围引用。