从多个列中查找值的位置

时间:2018-08-15 12:27:07

标签: excel vba excel-vba excel-formula lookup

我有一张4x4的桌子。表中的所有值都是唯一的。

    A   B   C   D
1   a   b   c   d
2   e   f   g   h
3   i   j   k   l
4   m   n   o   p

如何找到特定值的address?我尝试=CELL("address",MATCH(A1,A1:D4,0))来找到a,但是它返回一个错误值,因为=MATCH(A1,A1:D4,0)是一个错误值。

似乎=match仅适用于单个行/列。

有什么解决办法吗?

4 个答案:

答案 0 :(得分:3)

您可以将以下内容与不同的值一起使用

=CELL("ADDRESS",INDEX(A1:D4,SMALL(IF(NOT(ISERROR(SEARCH("a",A1:D4))),ROW(1:4),99^99),1),SMALL(IF(NOT(ISERROR(SEARCH("a",A1:D4))),COLUMN(A:D),99^99),1)))

使用 Ctrl + Shift + Enter

输入作为数组公式

数据:

Data


您可以将要查找的内容移到一个单独的单元格中,而不是将硬代码移到公式中,然后将整个内容包装在IFERROR中,以防例如找不到

example2

在G1中搜索值,在F1中搜索公式。

=IFERROR(CELL("ADDRESS",INDEX(A1:D4,SMALL(IF(NOT(ISERROR(SEARCH(G1,A1:D4))),ROW(1:4),99^99),1),SMALL(IF(NOT(ISERROR(SEARCH(G1,A1:D4))),COLUMN(A:D),99^99),1))),"")

这将返回找到的行:

SMALL(IF(NOT(ISERROR(SEARCH("a",A1:D4))),ROW(1:4),99^99),1)

这将返回找到的列:

SMALL(IF(NOT(ISERROR(SEARCH("a",A1:D4))),COLUMN(A:D),99^99),1)

然后将它们用于与索引为

的范围的相交
INDEX(A1:D4,.......)

答案 1 :(得分:2)

这是基于this solution to locate a value in a 2D array的另一种方法(不使用数组公式,即不点击cntrl-enter)。

enter image description here

为了在作者的网站上获得适当的信誉,我不会重复对其工作方式的出色解释。

  

编辑:根据@Chronocidal的出色建议,以下是新的改进版本供参考:

enter image description here

答案 2 :(得分:0)

最后一个使用VBA:

Function FINDaddress(VALUESEARCHED As String, ra As Range) As Variant

Dim A As Range

    Set A = ra.Find(What:=VALUESEARCHED, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

FINDaddress = A.Address

End Function

之后,您只需要使用自制功能:

=FINDaddress("a",A1:D4)

答案 3 :(得分:0)

您可以通过VBA创建自定义Function


findIn(what, where)

  

返回,它是范围/数组(A1)中搜寻元素(String)的what样式的“ where”。< br />   如果未包含在搜索范围内,则返回“ Not found

Private Function findIn(ByVal what As String, ByVal where As Range) As String

   Dim res As Range
   Set res = where.Find(what, LookIn:=xlValues)

   If Not res Is Nothing Then
     findIn = Col_Letter(res.Column) & res.Row 'returns A1 styled result
   Else
     findIn = "Not Found"
   End If

End Function

'col number to letter by brettdj
'(so.com)/questions/12796973/function-to-convert-column-number-to-letter/49577009)
Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

因此,如果我们要对其进行测试,则会产生预期的结果:

Private Sub test()
    Range("E1") = findIn("d", Range("A1:D4"))
End Sub

enter image description here

或者,如果将其放在单独的模块(Insert -> Module)中,也可以将其用作工作表功能

enter image description here