When you’d like to compare 2 arrays in EXCEL VBA whether they are equal or not, what would you do? Furthermore, you might get different elements that don’t overlap each other. I’d like to describe the code that how to get differences of 2 arrays.
At first, you would have to check whether they are equal each other or not because the difference of equal arrays is empty set. Next, you would have to check whether an array is proper subset of another array or not. At last, you could get difference between 2 arrays.
See formula as below, it is shown all elements of Array1 as “A”, all elements of Array2 as “B” and differences elements from Array1 and Array2 as “A And (not B)”.
The following code compares elements between two set and get number of equal elements with double loop, that means to get intersection of 2 sets.
Option Explicit Function COMPARE_ARRAY(ByRef Array1() As String, ByRef Array2() As String) As Boolean Dim i As Long Dim j As Long Dim k As Long k = 0 For i = LBound(Array1) To UBound(Array1) For j = LBound(Array2) To UBound(Array2) If Array1(i) = Array2(j) Then k = k + 1 End If Next j Next i If i = j And i = k Then COMPARE_ARRAY = True Else COMPARE_ARRAY = False End If End Function Function PROPERSUBSET_ARRAY(ByRef Array1() As String, ByRef Array2() As String) As Boolean Dim i As Long Dim j As Long Dim k As Long k = 0 For i = LBound(Array1) To UBound(Array1) For j = LBound(Array2) To UBound(Array2) If Array1(i) = Array2(j) Then k = k + 1 End If Next j Next i If k = i Then PROPERSUBSET_ARRAY = True Else PROPERSUBSET_ARRAY = False End If End Function
Configuration of the 3rd argument “Compare” specifies which array should be excepted, when it was TRUE the function would except the latter from the former, when it was FALSE then it would except the former from the latter, respectively. It’s assumed that the elements of arrays has no empty string.
Function EXCEPT_ARRAY(ByRef Array1() As String, ByRef Array2() As String, ByVal Compare As Boolean) As String() Dim i As Long Dim j As Long Dim k As Long Dim InternalAr1() As String Dim InternalAr2() As String Dim Ar1Ar() As String Dim Ar2Ar() As String InternalAr1 = Array1 InternalAr2 = Array2 For i = LBound(InternalAr1) To UBound(InternalAr1) For j = LBound(InternalAr2) To UBound(InternalAr2) If InternalAr1(i) = InternalAr2(j) Then InternalAr1(i) = "" InternalAr2(j) = "" k = k + 1 End If Next j Next i k = 0 For i = LBound(InternalAr1) To UBound(InternalAr1) If InternalAr1(i) = "" Then Else ReDim Preserve Ar1Ar(k) Ar1Ar(k) = InternalAr1(i) k = k + 1 End If Next i k = 0 For j = LBound(InternalAr2) To UBound(InternalAr2) If InternalAr2(j) = "" Then Else ReDim Preserve Ar2Ar(k) Ar2Ar(k) = InternalAr2(j) k = k + 1 End If Next j If Compare Then EXCEPT_ARRAY = Ar1Ar Else EXCEPT_ARRAY = Ar2Ar End If End Function