Arrays 匹配具有相同唯一值的数组VBA(Excel)

Arrays 匹配具有相同唯一值的数组VBA(Excel),arrays,excel,vba,intersection,Arrays,Excel,Vba,Intersection,我一直想弄明白这一点已经有一段时间了。起初,我搜索了谷歌,找到了一些(或多或少)我正在尝试做的事情的例子,但似乎仍然停留在我迄今为止的代码上。本质上,我试图比较两个数组之间的唯一变量,并在存在完全匹配时返回结果(如果其中一个数组具有唯一值,则表示另一个数组的子集,这将不是完全匹配,所有值和值的数量必须相同) 从我下面包含的代码中,如果我将一个数组[range”(“B2:b6”)与值{1,2,3}]进行比较,将第二个数组[(range”(“D10:D11”)与值{1,2}]进行比较,我会得到一个正

我一直想弄明白这一点已经有一段时间了。起初,我搜索了谷歌,找到了一些(或多或少)我正在尝试做的事情的例子,但似乎仍然停留在我迄今为止的代码上。本质上,我试图比较两个数组之间的唯一变量,并在存在完全匹配时返回结果(如果其中一个数组具有唯一值,则表示另一个数组的子集,这将不是完全匹配,所有值和值的数量必须相同)

从我下面包含的代码中,如果我将一个数组[range”(“B2:b6”)与值{1,2,3}]进行比较,将第二个数组[(range”(“D10:D11”)与值{1,2}]进行比较,我会得到一个正匹配。然而,根据我正在尝试做的(值顺序并不重要),在{1,2,3}数组中唯一完美的匹配将是第二个值数组{1,2,3}也是(或者{3,2,1}作为顺序并不重要)

我猜这是因为我使用的数组类型以及下限从0开始的事实。我也可能完全错了。我尝试过使用它,但没有成功

有什么想法吗?欢迎提供任何建议。谢谢!(包括下面不同值的图片)

函数唯一值(ByRef Arr1,ByRef Arr2)
如果Arr1的类型为Range,则Arr1=Arr1.Value2
如果Arr2的类型为Range,则Arr2=Arr2.Value2
暗淡的e,x,我一样长
使用CreateObject(“scripting.dictionary”)
.CompareMode=1
对于Arr1中的每个e
如果Len(e),则项目(e)=空
下一个
对于Arr2中的每个e
如果存在(e),则
.项目(e)=1
其他的
.RemoveAll
UniqueVal=.Keys
退出功能
如果结束
下一个
x=数组(.key、.Items)
.RemoveAll
对于i=0到UBound(x(0))
如果x(1)(i)=1,则项(x(0)(i))=空
下一个
如果.Count,则UniqueVal=.Keys
以
端函数
'和下面调用上述函数的子对象
子iTestIntersectionX()
array4=Join(唯一值(工作表(“arrayTest2”).Range(“B2:B6”)、工作表(“arrayTest2”).Range(“D10:D11”)、vbLf)
工作表(“arrayTest2”)。范围(“H20”)。值=array4
如果工作表(“arrayTest2”).范围(“H20”).值为“”,则
MsgBox“找到匹配项!”
其他的
MsgBox“未找到匹配项!”
如果结束
端接头

有一个公式可以输入一个名为VLOOKUP的单元格。它需要几个参数。它在单元格列表中查找一个单元格的值,并返回单元格列表中匹配单元格旁边的单元格的值。

如果传入的两个范围具有相同的唯一值集,则返回True(以任何顺序或频率)


您使用的值是否总是来自范围?
Function UniqueVal(ByRef Arr1, ByRef Arr2)

    If TypeOf Arr1 Is Range Then Arr1 = Arr1.Value2
    If TypeOf Arr2 Is Range Then Arr2 = Arr2.Value2

    Dim e, x, i As Long

     With CreateObject("scripting.dictionary")
        .CompareMode = 1
        For Each e In Arr1
            If Len(e) Then .Item(e) = Empty
        Next
        For Each e In Arr2
            If .Exists(e) Then
                .Item(e) = 1
            Else
                .RemoveAll
                UniqueVal = .Keys
                Exit Function
            End If
        Next

        x = Array(.Keys, .Items)
        .RemoveAll
        For i = 0 To UBound(x(0))
            If x(1)(i) = 1 Then .Item(x(0)(i)) = Empty
        Next
        If .Count Then UniqueVal = .Keys
    End With

End Function

'and the below sub which calls the above function

Sub iTestIntersectionX()

array4 = Join(UniqueVal(Worksheets("arrayTest2").Range("B2:B6"), Worksheets("arrayTest2").Range("D10:D11")), vbLf)
Worksheets("arrayTest2").Range("H20").value = array4

If Worksheets("arrayTest2").Range("H20").value <> "" Then
   MsgBox "Match Found!"
  Else
   MsgBox "No Match Found!"
End If

End Sub
Function HaveSameValues(rng1 As Range, rng2 As Range)
Dim c As Range

    For Each c In rng1.Cells
        If Len(c.Value) > 0 And IsError(Application.Match(c.Value, rng2, 0)) Then
            SameValues = False
            Exit Function
        End If
    Next c
    For Each c In rng2.Cells
        If Len(c.Value) > 0 And IsError(Application.Match(c.Value, rng1, 0)) Then
            SameValues = False
            Exit Function
        End If
    Next c

    SameValues = True

End Function