检查值是否存在于 Excel 范围内的任何地方
Checking if a value exists anywhere in range in Excel
我想检查单元格 A1 的值是否存在于任何地方
来自 sheet2!$A$2:$z$50.
如果值存在,则return 第一行 的值位于找到匹配项的列。
我试过了:
- VLOOKUP
- HLOOKUP
但此功能仅限于检查单行/单列是否匹配。
我希望得到类似 =IF(A1,sheet2!$A:$Z,x1,FALSE)
的东西
其中 x = 找到匹配项的列。
有这样的吗?
我想如果你使用辅助细胞就可以做到。
- 在辅助行中,在每一列上以精确模式使用
MATCH()
来查找该列中值的行索引(如果存在)。将其包装在 NOT(ISERROR())
中以将结果转换为 true/false 二进制数据。真 = 匹配; FALSE = 不匹配。
- 然后在辅助行上再次使用
MATCH()
,这次找到第一个 TRUE(即匹配)列; MATCH()
将 return 列的索引;然后您可以使用 INDEX()
查找该列中第一行的值。
像这样的数组公式可以工作
同时按ShiftCtrlEnter
=IF(COUNTIF(A2:Z50,A1)>0,MIN(IF(A2:Z50=A1,ROW(A2:Z50),51)),"not found")
说 Sheet2 就像:
我们想要 Sheet1 上的一个公式,它将 return header 行中的值,如果列包含要查找的值。所以如果 A1 包含 Good Guy 那么公式应该 return Victor Laszlo
将以下UDF放入标准模块中:
Public Function GetHeader(v As Variant, rTable As Range) As Variant
Dim rHead As Range, rData As Range, WhereIsIt As Range
Set rHead = Intersect(rTable(1).EntireRow, rTable)
Set rData = Intersect(rTable.Offset(1), rTable)
Set WhereIsIt = rData.Find(what:=v, After:=rData(1))
If WhereIsIt Is Nothing Then
v = "NOT FOUND"
Exit Function
End If
GetHeader = Intersect(WhereIsIt.EntireColumn, rHead).Value
End Function
用户定义函数 (UDF) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I
ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果您保存工作簿,UDF 将随之保存。
如果您使用的 Excel 版本晚于 2003,则必须保存
文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 Excel 的 UDF:
=GetHeader(A1,Sheet2!A1:Z50)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能运行!
注意:
我们为 UDF 提供整个范围 ,包括 header 行 (尽管 header 行被排除在搜索之外)
我最喜欢 return 从查找中获取值 sheet 如果查找 sheet 和要输入数据的 sheet 中都存在对应的单元格进入是
INDEX('Sheet1'!I:I,(MATCH(D2,'Sheet1'!A:A,0)))
这基本上是 Vlookup 或 Match If 公式的更灵活版本。它说的是你在 Sheet 1 的 A:A 列中找到一个与 D2 中的值匹配的值,然后 return 来自 I:I 列的相应值(来自同一行) =23=] 1.
如果我想匹配两个 sheet 之间的数据,我会使用它,例如定价与产品名称或 SKU 匹配。
我想检查单元格 A1 的值是否存在于任何地方 来自 sheet2!$A$2:$z$50.
如果值存在,则return 第一行 的值位于找到匹配项的列。
我试过了:
- VLOOKUP
- HLOOKUP
但此功能仅限于检查单行/单列是否匹配。
我希望得到类似 =IF(A1,sheet2!$A:$Z,x1,FALSE)
的东西
其中 x = 找到匹配项的列。
有这样的吗?
我想如果你使用辅助细胞就可以做到。
- 在辅助行中,在每一列上以精确模式使用
MATCH()
来查找该列中值的行索引(如果存在)。将其包装在NOT(ISERROR())
中以将结果转换为 true/false 二进制数据。真 = 匹配; FALSE = 不匹配。 - 然后在辅助行上再次使用
MATCH()
,这次找到第一个 TRUE(即匹配)列;MATCH()
将 return 列的索引;然后您可以使用INDEX()
查找该列中第一行的值。
像这样的数组公式可以工作
同时按ShiftCtrlEnter
=IF(COUNTIF(A2:Z50,A1)>0,MIN(IF(A2:Z50=A1,ROW(A2:Z50),51)),"not found")
说 Sheet2 就像:
我们想要 Sheet1 上的一个公式,它将 return header 行中的值,如果列包含要查找的值。所以如果 A1 包含 Good Guy 那么公式应该 return Victor Laszlo
将以下UDF放入标准模块中:
Public Function GetHeader(v As Variant, rTable As Range) As Variant
Dim rHead As Range, rData As Range, WhereIsIt As Range
Set rHead = Intersect(rTable(1).EntireRow, rTable)
Set rData = Intersect(rTable.Offset(1), rTable)
Set WhereIsIt = rData.Find(what:=v, After:=rData(1))
If WhereIsIt Is Nothing Then
v = "NOT FOUND"
Exit Function
End If
GetHeader = Intersect(WhereIsIt.EntireColumn, rHead).Value
End Function
用户定义函数 (UDF) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果您保存工作簿,UDF 将随之保存。 如果您使用的 Excel 版本晚于 2003,则必须保存 文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 Excel 的 UDF:
=GetHeader(A1,Sheet2!A1:Z50)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能运行!
注意:
我们为 UDF 提供整个范围 ,包括 header 行 (尽管 header 行被排除在搜索之外)
我最喜欢 return 从查找中获取值 sheet 如果查找 sheet 和要输入数据的 sheet 中都存在对应的单元格进入是
INDEX('Sheet1'!I:I,(MATCH(D2,'Sheet1'!A:A,0)))
这基本上是 Vlookup 或 Match If 公式的更灵活版本。它说的是你在 Sheet 1 的 A:A 列中找到一个与 D2 中的值匹配的值,然后 return 来自 I:I 列的相应值(来自同一行) =23=] 1.
如果我想匹配两个 sheet 之间的数据,我会使用它,例如定价与产品名称或 SKU 匹配。