【问题标题】:Excel: Check if cell string value exists in column, and get all cell references to that stringExcel:检查列中是否存在单元格字符串值,并获取对该字符串的所有单元格引用
【发布时间】:2015-02-09 19:37:49
【问题描述】:

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

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

工作表 2 (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 中的单元格值,所以我不知道它们为什么返回 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 excel vlookup


    【解决方案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? 中;但它们当然可能在工作表 1 的 B5:B? 和工作表 2 的 C7:C? 中。您需要清楚地调整代码以适应当前数据。

    【讨论】:

    • 它工作!这太棒了。额外问题 - 1. 我如何获得单元格的实际值,而不是单元格地址? (我知道,我最初的请求措辞不正确,抱歉!),以及 2. CAS2 中每个单元格中的单词由破折号 (-) 或空格分隔。现在,搜索 BAT001 文本将返回包含文本值“TRBAT001-foo bar”(无引号)的单元格。我只希望它包含半精确的单元格,例如“BAT001-foo bar”。希望这是有道理的,非常感谢您的帮助
    • @user2565123,如果要返回单元格的值,只需要写cell.Offset(0, recFound) = cell2.Value而不是Split()组合。但是,我不太明白:如果您搜索“AA”并得到“BBAACC”,您只想返回“AACC”吗?在这种情况下,这就是字符串解析:因此您应该通过接受您最喜欢的答案并发布一个新答案来结束此问题(如果您无法通过现有线程找到解决方案)。
    • 完美!重新解释我的意思 - 宏将返回在其自己的字符串中包含 CAS1 单词 anywhere 的任何单元格(因此,搜索“BAT001”将返回“TRBAT001-foo bar.jpg”。但是,如果单元格字符串本身包含确切的单词“BAT001”,例如“BAT001.jpg”,或者包含任何其他单词,例如“BAT001-foo bar.png”,我只想返回该单元格,not 当单词构成另一个单词的一部分时。我相信图像 .jpg 或 .png 扩展名会增加更多复杂性!
    • 没问题!再次,非常感谢您的帮助。毫无疑问,这篇文章将来会帮助其他人
    • @user2565123 如果问题已结束,请接受一个答案。
    【解决方案2】:

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

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

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

    将返回 TRUE 或 FALSE。 但是这个公式必须通过按住CTRL-SHIFT同时点击ENTER输入如果你这样做正确,Excel将放置大括号 {...} 围绕您可以在公式栏中看到的公式。

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。我很想得到这个工作,但是,当我推断出第一个公式时,结果总是错误的,即使我知道情况并非如此。下面是一个示例:在 CAS1 中的一个单元格中包含 RV008,在 CAS2 中的一个单元格中包含 RV008-oval-CO.jpg。但我仍然得到 FALSE 结果?
    • @user2565123 这些是您发布的示例中的两个示例,它在这里有效。你确定你的单元格引用是正确的吗?你确定你用 ctrl-shift-enter 将它作为 array-formula 输入吗?如果您查看公式栏中的公式,您是否看到公式周围的大括号 {...}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2020-03-02
    • 2013-02-15
    • 2021-10-10
    相关资源
    最近更新 更多