[英]Excel: Check if cell string value exists in column, and get all cell references to that string
我怀疑这可能是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可以解决此问题(至少,我认为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?
在两张纸上; 但是它们当然可能例如在B5:B?
表1和C7:C?
表2的内容。您需要清楚地使代码适应当前数据。
不需要VBA。 一些简单的数组公式可以完成这项工作。
要查看CAS2中是否存在CAS1中的条目:
=OR(ISNUMBER(SEARCH(A2,CAS2_)))
将返回TRUE或FALSE。 但是必须在按下ENTER 键的同时按住CTRL-SHIFT键输入此公式。如果正确执行此操作,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_是两个文本组的命名范围或绝对范围引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.