当前位置: 首页 > 知识库问答 >
问题:

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

郎长卿
2023-03-14

我怀疑这可能是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或不匹配。我怀疑这可能是由于文本内容的性质。以下是一些示例数据

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个答案

伯君浩
2023-03-14

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

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

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

返回TRUE或FALSE。但是,必须在按住CTRL-SHIFT键的同时按ENTER键来输入此公式。如果操作正确,Excel将在公式栏中可以看到的公式周围放置大括号{…}。

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

为了返回地址,可以在CAS1中与单元格相邻的位置输入以下数组公式:

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

向右填充尽可能多的地址,然后选择组并向下填充。

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

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

赫连坚
2023-03-14

这个问题可以通过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

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

 类似资料:
  • 我的C#. Net应用程序通过使用excel公式字符串加载和读取excel工作表单元格值。 例如,excel工作表位置和选项卡名称及其单元格行/列将作为公式字符串提供。 'D:\DataX[数据.Xls]EOD'$A5级 根据上述公式-C#应用程序加载数据。Xls,并打开EOD选项卡,应读取第5行A列值。 寻找在C#中完成的最佳方式。Net框架。

  • 问题内容: 我有这样的内容的Excel文件: A1:SomeString A2:2 所有字段均设置为字符串格式。 当我使用POI读取Java中的文件时,它表明A2为数字单元格格式。 问题在于A2中的值可以是2或2.0(并且我希望能够区分它们),所以我不能只使用.toString()。 如何将值读取为字符串? 问题答案: 当您提出问题时,我认为我们没有上过这堂课,但是今天有一个简单的答案。 您要做的

  • 问题内容: 我正在使用Apache POI库读取Excel文件。我在读取密码单元时被卡住了。如果用户在密码单元格中输入日期作为密码,即16/05/2012。我正在将此值读取为“ 41045”,而该值应为“ 16/05/2012”。这是我的代码: 有人可以帮忙吗? 谢谢。 问题答案: 您在POI中寻找的类是DataFormatter 当Excel写入文件时,某些单元格将存储为文字字符串,而另一些单元

  • 问题内容: 我需要检查单词中是否存在元音。如果是这样,应对“说”一词进行操作。我想避免for循环,因为我想到了这一点: 请推荐一种执行时间成本较低的方法。另外,也请帮助我纠正上述方法。 问题答案: vowels = {“a”, “e”, “i”, “o”, “u”, “A”, “E”, “I”, “O”, “U”} if any(char in vowels for char in word):

  • 在寻找这个问题的答案时,我也遇到过类似的利用LINQ的方法,但是我还不能完全理解它们(并因此实现它们),因为我对它还不熟悉。基本上,我想说的是: 检查列表的任何元素是否包含特定字符串。 如果是,则获取该元素。 老实说,我不知道该如何着手做那件事。我能想出的是这个(当然不工作): 我知道为什么它不起作用: 不返回,因为它将检查列表的整个元素是否与我指定的字符串匹配 不会找到匹配项,因为它将再次检查与

  • 问题内容: 我正在电子表格中查找具有字符串’Total’的单元格,然后使用该单元格所在的行来查找另一个始终为相同单元格/列的单元格的总值(0中的第10个单元格基于索引)。 我有以下代码,没有错误(语法),但是findCell方法未返回rowNum值: 问题答案: 此方法修复是解决您的问题的方法: 请记住,您仍然是一个固定值。