Option Explicit
Public Function LookupAddress(lookup_value As String, lookup_range As Range, Optional match_case As Boolean) As String
LookupAddress = lookup_range.Find(lookup_value, LookAt:=xlWhole, MatchCase:=match_case).Address
End Function
然后,要返回匹配值的单元格地址(不区分大小写),请使用:用途:
=LookupAddress(A2, ws2!$C$2:$E$80)
或者,对于区分大小写的匹配,用途:
=LookupAddress(A2, ws2!$C$2:$E$80, TRUE)
您还可以在未找到匹配项的情况下向函数添加错误处理;但是,使用现有的IFERROR()函数也很容易:
=IFERROR(LookupAddress(A2, ws2!$C$2:$E$80, TRUE), "No match")
3条答案
按热度按时间kadbb4591#
VLOOKUP
从给定的列开始,并返回从start column = 1开始向右的引用列n
列中的值。因此
=VLOOKUP(A2,B2:C10,2,FALSE)
返回列C中的值(列B =1,列C =2),其中列A中找到的第一个值(A2的起始列:C10)等于A2的值。如果我们将2替换为1,它将返回列A(=1)中的值,其中该列中的值与A20的值匹配。
如果我们用3替换2,它会返回一个错误,因为我们引用的范围由2列组成,所以引用第3列是不可能的。你必须将范围扩展到
=VLOOKUP(A2,B2:D10,2,FALSE)
。也就是说,要在2D范围内查找值的列号,VLOOKUP将不起作用。
您可以像这样将IF或REPT与TEXTJOIN结合使用:
=TEXTJOIN(", ",1,TRANSPOSE(IF($C$2:$G$5=$A2, COLUMN($C$2:$G$5),"")))
或
=TEXTJOIN(", ",,REPT(COLUMN($C$2:$E$4),$C$2:$E$4=$A2))
如果在范围内发现多个值,两个版本合并都会合并列号(逗号分隔):
d8tt03nd2#
是的,COLUMN函数需要一个单元格引用,而VLOOKUP函数返回一个值,而不是单元格引用。
尝试以下功能:它将获取单元格A2中ws 2!$C$2:$E$80并返回该列号。如果未找到,则返回#N/A。
dxxyhpgq3#
既然你已经标记了
VBA
,你可以使用一个非常简单的UDF和Range.Find
方法:然后,要返回匹配值的单元格地址(不区分大小写),请使用:用途:
或者,对于区分大小写的匹配,用途:
您还可以在未找到匹配项的情况下向函数添加错误处理;但是,使用现有的
IFERROR()
函数也很容易:您还可以使用其他选项,例如使用
LookAt:=xlPart
查找部分匹配,使用SearchOrder:=xlByColumns
按列而不是行进行搜索,或使用SearchDirection:=xlPrevious
从下到上、从右到左进行搜索。但是,上面概述的基本UDF应该满足您的需求。**注意:如果您的目的是在一列中查找值,然后在另一列中返回相应值的地址,则可以在
Range.Find.Offset.Address
中使用额外的 *col_offset参数。干杯!干杯!