Excel-两个键值列表-查找键值不同但值相同的位置

Excel-两个键值列表-查找键值不同但值相同的位置,excel,excel-formula,Excel,Excel Formula,我有两个关键值列表 e、 g 表1 ID Value 1 Example A 2 Example B 及 表2 ID Value 1 Example A 3 Example B 我需要知道这些值在哪里匹配,但ID不同。在上面的示例中,这将是示例B,因为在表1中它的ID为2,但在表2中它的ID为3 我相信我可以使用索引或匹配函数,但我不知道该怎么做 假设列的顺序被切换,我们可以很容易地在这里使用VLOOKUP: Sheet 1

我有两个关键值列表

e、 g

表1

ID      Value
1       Example A
2       Example B

表2

ID      Value
1       Example A
3       Example B
我需要知道这些值在哪里匹配,但ID不同。在上面的示例中,这将是示例B,因为在表1中它的ID为2,但在表2中它的ID为3


我相信我可以使用索引或匹配函数,但我不知道该怎么做

假设列的顺序被切换,我们可以很容易地在这里使用
VLOOKUP

Sheet 1, Table 1
A              B      C
Example A      1
Example B      2      DIFFERENT

Sheet 2, Table 2
A              B
Example A      1
Example B      3
在表1的第一页C1中输入以下公式:

=IF(B1=IFERROR(VLOOKUP(A1, Sheet2!A1:B2, 2, FALSE), ""), "", "DIFFERENT")

请注意,您可能需要调整公式中使用的单元格引用和范围。例如,我简单地假设两个表只有两行数据,而实际上它们可能有更多的数据。

假设列的顺序被切换,我们可以相当容易地在这里使用
VLOOKUP

Sheet 1, Table 1
A              B      C
Example A      1
Example B      2      DIFFERENT

Sheet 2, Table 2
A              B
Example A      1
Example B      3
在表1的第一页C1中输入以下公式:

=IF(B1=IFERROR(VLOOKUP(A1, Sheet2!A1:B2, 2, FALSE), ""), "", "DIFFERENT")

请注意,您可能需要调整公式中使用的单元格引用和范围。例如,我简单地假设两个表只有两行数据,而实际上它们可能有更多的数据。

假设您的数据在同一张表中,您可以使用下面的简单公式来比较单元格


假设您的数据在同一张表中,您可以使用下面的简单公式来比较单元格

仅适用于S&G:

VBA是不必要的,但我想尝试使用.Net System.Collections
SortedList
class创建一个基本的UDF。这是基于一个假设,即值不会在表中重复(就返回正确结果而言)

Arg 1 rng1是不包括标题的第一个表范围

Arg 2 rng2是不包括标题的第二个表格范围

Arg 3 testValue是要检查的值的字符串值,该值跨表具有匹配的id。您可以通过在中传递单个单元格范围或显式传递文本字符串来依赖默认成员访问

Option Explicit
Public Sub test()
   Debug.Print MatchingKey([A2:B3], [D2:E3], [B3])
End Sub
Public Function MatchingKey(ByVal rng1 As Range, ByVal rng2 As Range, ByVal testValue As String) As Variant
    Dim aList As Object, bList As Object, aArray(), bArray(), i As Long

    If rng1.Columns.Count <> 2 Or rng2.Columns.Count <> 2 Then
        MatchingKey = CVErr(xlErrNA)
        Exit Function
    End If
    On Error GoTo errhand
    Set aList = CreateObject("System.Collections.SortedList")
    Set bList = CreateObject("System.Collections.SortedList")

    aArray = rng1.value
    bArray = rng2.value

    For i = LBound(aArray, 1) To UBound(aArray, 1)
        aList.Add aArray(i, 1), aArray(i, 2)
    Next
    For i = LBound(bArray, 1) To UBound(bArray, 1)
        bList.Add bArray(i, 1), bArray(i, 2)
    Next

    If Not aList.ContainsValue(testValue) Or Not bList.ContainsValue(testValue) Then
        MatchingKey = CVErr(xlErrNA)
        Exit Function
    End If

    MatchingKey = aList.GetKey(aList.IndexOfValue(testValue)) = bList.GetKey(bList.IndexOfValue(testValue))
    Exit Function
errhand:
    MatchingKey = CVErr(xlErrNA)
End Function
选项显式
公共子测试()
调试。打印匹配键([A2:B3]、[D2:E3]、[B3])
端接头
公共函数匹配键(ByVal rng1作为范围,ByVal rng2作为范围,ByVal testValue作为字符串)作为变量
Dim-aList作为对象,bList作为对象,aArray(),bArray(),i作为长
如果是rng1.Columns.Count 2或rng2.Columns.Count 2,则
匹配键=CVErr(xlErrNA)
退出功能
如果结束
在错误上走错
Set aList=CreateObject(“System.Collections.SortedList”)
Set bList=CreateObject(“System.Collections.SortedList”)
aArray=rng1.0值
bArray=rng2.0值
对于i=LBound(aArray,1)到UBound(aArray,1)
列表.添加aArray(i,1),aArray(i,2)
下一个
对于i=LBound(bArray,1)到UBound(bArray,1)
添加bArray(i,1),bArray(i,2)
下一个
如果不是aList.ContainsValue(testValue)或不是bList.ContainsValue(testValue),则
匹配键=CVErr(xlErrNA)
退出功能
如果结束
MatchingKey=aList.GetKey(aList.IndexOfValue(testValue))=bList.GetKey(bList.IndexOfValue(testValue))
退出功能
错误:
匹配键=CVErr(xlErrNA)
端函数

表格中的示例:

仅适用于S&G:

VBA是不必要的,但我想尝试使用.Net System.Collections
SortedList
class创建一个基本的UDF。这是基于一个假设,即值不会在表中重复(就返回正确结果而言)

Arg 1 rng1是不包括标题的第一个表范围

Arg 2 rng2是不包括标题的第二个表格范围

Arg 3 testValue是要检查的值的字符串值,该值跨表具有匹配的id。您可以通过在中传递单个单元格范围或显式传递文本字符串来依赖默认成员访问

Option Explicit
Public Sub test()
   Debug.Print MatchingKey([A2:B3], [D2:E3], [B3])
End Sub
Public Function MatchingKey(ByVal rng1 As Range, ByVal rng2 As Range, ByVal testValue As String) As Variant
    Dim aList As Object, bList As Object, aArray(), bArray(), i As Long

    If rng1.Columns.Count <> 2 Or rng2.Columns.Count <> 2 Then
        MatchingKey = CVErr(xlErrNA)
        Exit Function
    End If
    On Error GoTo errhand
    Set aList = CreateObject("System.Collections.SortedList")
    Set bList = CreateObject("System.Collections.SortedList")

    aArray = rng1.value
    bArray = rng2.value

    For i = LBound(aArray, 1) To UBound(aArray, 1)
        aList.Add aArray(i, 1), aArray(i, 2)
    Next
    For i = LBound(bArray, 1) To UBound(bArray, 1)
        bList.Add bArray(i, 1), bArray(i, 2)
    Next

    If Not aList.ContainsValue(testValue) Or Not bList.ContainsValue(testValue) Then
        MatchingKey = CVErr(xlErrNA)
        Exit Function
    End If

    MatchingKey = aList.GetKey(aList.IndexOfValue(testValue)) = bList.GetKey(bList.IndexOfValue(testValue))
    Exit Function
errhand:
    MatchingKey = CVErr(xlErrNA)
End Function
选项显式
公共子测试()
调试。打印匹配键([A2:B3]、[D2:E3]、[B3])
端接头
公共函数匹配键(ByVal rng1作为范围,ByVal rng2作为范围,ByVal testValue作为字符串)作为变量
Dim-aList作为对象,bList作为对象,aArray(),bArray(),i作为长
如果是rng1.Columns.Count 2或rng2.Columns.Count 2,则
匹配键=CVErr(xlErrNA)
退出功能
如果结束
在错误上走错
Set aList=CreateObject(“System.Collections.SortedList”)
Set bList=CreateObject(“System.Collections.SortedList”)
aArray=rng1.0值
bArray=rng2.0值
对于i=LBound(aArray,1)到UBound(aArray,1)
列表.添加aArray(i,1),aArray(i,2)
下一个
对于i=LBound(bArray,1)到UBound(bArray,1)
添加bArray(i,1),bArray(i,2)
下一个
如果不是aList.ContainsValue(testValue)或不是bList.ContainsValue(testValue),则
匹配键=CVErr(xlErrNA)
退出功能
如果结束
MatchingKey=aList.GetKey(aList.IndexOfValue(testValue))=bList.GetKey(bList.IndexOfValue(testValue))
退出功能
错误:
匹配键=CVErr(xlErrNA)
端函数

表格中的示例:


您可以尝试使用match公式

H、 G:查找值(表2)

B、 A:查找数组(表1)

ctrl+shift+Enter

{=IF(ISNUMBER(MATCH(1,(H2=B2:B3)*(G2=A2:A3),0)),"Match","Not Match")}

你可以试试匹配公式

H、 G:查找值(表2)

B、 A:查找数组(表1)

ctrl+shift+Enter

{=IF(ISNUMBER(MATCH(1,(H2=B2:B3)*(G2=A2:A3),0)),"Match","Not Match")}

如果在同一个表中有针对不同ID的重复值(其中一个-后面的一个可能跨表匹配),会发生什么情况?这种情况可能发生吗?如果在同一个表中有针对不同ID的重复值(其中一个-后面的一个可能在多个表中匹配),会发生什么情况?这种情况可能吗?谢谢你的例子,但我尝试这种方法时总是会遇到一个引用错误(#N/a)。当我使用计算步骤向导时,问题似乎与中的数组有关VLOOKUP@martpendle我看不到你的工作表/工作簿,所以我猜不出有什么问题。如果你有我的答案的准确设置