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

Excel: Check if cell string value exists in column, and get all cell references to that string

我怀疑这可能是 VBA 的工作,这超出了我的能力范围。但情况是这样的:

Sheet1 (CAS1) 中的列 A 包含 x 行文本值

Sheet2 (CAS2) 中的 A 列包含 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 中的单元格值,所以我不知道为什么它们 return 错误或不匹配。我怀疑这可能取决于文本内容的性质。所以这里有一些示例数据:

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 解决(至少,我认为 VBA 解决方案比可能的 Excel 解决方案更容易)。您需要一个宏,对于 CAS1 中的每一行,搜索 CAS2 每一行中的内容,然后 returns 您的地址。

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(),那应该是运行得到的结果。正如我的代码中所评论的那样,我假设数据在两个 sheet 的 A1:A? 中;但它们当然可能在 sheet 1 的 B5:B? 和 sheet 2 的 C7:C? 中。您需要清楚地调整代码以适应您当前的需求数据.

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

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

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

将 return 正确或错误。 BUT 必须通过按住 CTRL-SHIFT 的同时按 ENTER 输入此公式 如果您这样做正确地,Excel 将在您可以在公式栏中看到的公式周围放置大括号 {...}

SEARCH 函数 return 是一个结果数组,可以是 #VALUE!错误,或一个数字。

为了return地址,可以在CAS1的单元格附近输入以下数组公式

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

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

在这种情况下,被 returned 的数组是一个由 0 或 1 * 行号(即行号)组成的字符串。我假设 CAS2 中的数据在 A 列中,但您可以根据需要更改列号(或者如果需要,甚至可以通过将 ADDRESS 函数中的 1 替换为 COLUMN(CAS2_) 来计算它)

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