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

时间:2015-02-08 23:03:02

标签: excel vba excel-vba vlookup

我怀疑这可能是VBA的一项工作,这超出了我的能力范围。但是在这种情况下:

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

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

A部分 - 对于CAS1中的每个行值,我需要知道该字符串是否包含在CAS2中的任何单元格中。不完全匹配,字符串只能是搜索单元格的一部分。

B部分 - 我需要知道CAS2中每个包含CAS1值的单元格的单元格值(如果它们确实存在,它们可以列在CAS1中正在搜索的单元格旁边的单元格中)。

我已尝试以下方法尝试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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

这个问题可以通过VBA来解决(至少,我认为VBA解决方案比可能的Excel更容易)。您需要一个宏,对于CAS1中的每一行,搜索CAS2每行中的内容并返回地址。

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

以上所有内容都应包含在宏中,例如: Sub makeMySearch(),应该运行以获得结果。正如我的代码中所评论的,我假设数据在两张表的A1:A?中;但它们当然可能是,例如,在工作表2的B5:B?和工作表2的C7:C?中。您需要清楚地使代码适应您当前的数据。

答案 1 :(得分:1)

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

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

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

将返回TRUE或FALSE。 但是此公式必须通过按住 CTRL-SHIFT 进入 ENTER ,如果您正确执行此操作,Excel将放置大括号 {...} 围绕您可以在公式栏中看到的公式。

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

为了返回地址,可以在CAS1中的单元格旁边输入以下 array-formula

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

填写最大可能地址数,然后选择该组并填写。

在这种情况下,返回的数组是0到0的字符串,或1 *行号(即行号)。我认为CAS2中的数据位于A列,但您可以根据需要更改列号(如果需要,甚至可以使用1替换ADDRESS函数中的COLUMN(CAS2_)来计算列数)

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