Formula:
这是一个仅包含公式的解决方案,没有隐藏/辅助列,也没有数组公式:
=ADDRESS(
ROW(
ClientInfo
) - 1 +
MATCH(
1,
INDEX(
--INDEX(
ClientInfo[Client] = $A5,
0
) *
--INDEX(
ClientInfo[Company] = $B5,
0
),
0
),
0
),
COLUMN(ClientInfo)
)
成分:
a --INDEX(ClientInfo[Client]=$A5,0)
- 返回一个布尔数组,表示尽可能多的匹配,例如Chris Evans
in ClientInfo[Client]
。在下面的示例中,这将是{TRUE,TRUE,FALSE,FALSE}
。然后将其转换为整数数组,并使用双一元运算符离开{1,1,0,0}
b --INDEX(ClientInfo[Company]=$B5,0)
- 与相同的事情a e.g. Apple
in ClientInfo[Company]
示例中是数组{TRUE,FALSE,FALSE,TRUE}
- 然后被投射到{1,0,0,1}
c INDEX(a*b,0)
- 数组的多个元素 1..na数组的元素 1..nb。在我们的示例中,这会导致{1,0,0,0}
此时,您已将 Chris Evans 和 Apple 的匹配组合键确定为 ClientInfo 的第一行
d MATCH(1,c,0)
- 获取数组中 1 的索引,在我们的 Chris Evans 和 Apple 示例中为 1。您提到过它们将是独特的条目所以我认为我们这里没有问题。
e ROW(ClientInfo)-1+d
- 我定义ClientInfo
作为一个 Table/ListObject,其范围为A8:D12
但参考正在回馈A9:D12
这似乎是表/列表对象的命名范围的工作方式。所以我们需要从ROW
该范围以获得偏移的开始;然后简单地添加结果d.
f ADDRESS(e,COLUMN(ClientInfo))
- 返回单元格地址e和第一列ClientInfo
table.
Example:
VBA:
使用上面的示例,VBA 方法将执行以下操作:
- 假设没有找到匹配项
- 迭代表的行
- 获取候选值并检查引用列的输入
- 如果两者匹配则退出循环返回地址
代码:
Option Explicit
Sub Test()
MsgBox GetAddressOfKey("Client", "Chris Evans", "Company", "Apple", "ClientInfo")
MsgBox GetAddressOfKey("Client", "Chris Evans", "Company", "Google", "ClientInfo")
MsgBox GetAddressOfKey("Client", "Bill Gates", "Company", "Burger King", "ClientInfo")
End Sub
Function GetAddressOfKey(col1 As String, val1 As String, col2 As String, val2 As String, strTable As String) As String
Dim lst As ListObject
Dim lr As ListRow
Dim strAddress As String
Dim strCandidate1 As String
Dim strCandidate2 As String
strAddress = ""
Set lst = ActiveSheet.ListObjects(strTable)
'iterate rows
For Each lr In lst.ListRows
'get candidate values
strCandidate1 = Intersect(lr.Range, lst.ListColumns(col1).Range).Value
strCandidate2 = Intersect(lr.Range, lst.ListColumns(col2).Range).Value
'check against inputs
If strCandidate1 = val1 And strCandidate2 = val2 Then
strAddress = lst.Range.Cells(lr.Index + 1, 1).Address
'quit if we find a match
Exit For
End If
Next lr
'return
GetAddressOfKey = strAddress
End Function
PS 我对是否提供 VBA 答案犹豫不决,而您已经接受了一个不错的答案。然而,我稍微倾向于在不更新 UI 的情况下执行此操作,尽管我同意AutoFilter
方法已经足够好了。华泰