我怀疑这可能是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
任何帮助都将不胜感激。
答案 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_是命名范围,或两个文本组的绝对范围引用。