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
