Jämföra matriser

Här demonstreras en relativ okomplicerad teknik för att jämföra matriser (arrayer) med varandra. Resultatet kan antingen bli värden som finns i en lista men inte i den andra listan eller värden som förekommer i båda listorna.

I första exemplet jämförs två listor och där resultatet visar de värden som finns i Lista 1 men inte i Lista 2.

Option Explicit
Option
Base 1


Sub
Jamfora_MatriserI()

  
'© 2002 Alla rättigheter XL-Dennis
  
Dim rnData1 As Range, rnData2 As Range
  
Dim lnTal() As Long
  
Dim vaData1 As Variant, vaData2 As Variant
  
Dim i As Long, j As Long  

   Set rnData1 = Range("A2:A6")

   Set rnData2 = Range("B2:B6")

   vaData1 = rnData1.Value

   vaData2 = rnData2.Value

    j = 1

    For i = 1 To UBound(vaData2, 1)
     
'Varje gång sökning med PASSA-funktionen genererar #Saknas tilldelas
     
'matrisen värdet från Lista 1
     
If IsError(Application.Match(vaData1(i, 1), vaData2, 0)) Then
        
ReDim Preserve lnTal(j)
         lnTal(j) = vaData1(i,
1)
         j = j +
1
     
End If
  
Next i

   Range("C2").Resize(UBound(lnTal)).Value = Application.Transpose(lnTal)

End Sub

 

I det andra exemplet jämförs två listor och där resultatet visar de värden som finns i Lista 1 och i Lista 2.

Skillnaden mellan de två procedurerna är att "Not" finns angivet före "IsError".

Option Explicit
Option
Base 1


Sub
Jamfora_MatriserII()

  
'© 2002 Alla rättigheter XL-Dennis
  
Dim rnData1 As Range, rnData2 As Range
  
Dim lnTal() As Long
  
Dim vaData1 As Variant, vaData2 As Variant
  
Dim i As Long, j As Long

   Set rnData1 = Range("A2:A6")

   Set rnData2 = Range("B2:B6")

    vaData1 = rnData1.Value

   vaData2 = rnData2.Value

    j = 1

    For i = 1 To UBound(vaData2, 1)
     
'Varje gång sökningen hittar motsvarande värde i Lista 2 från Lista 1
     
'tilldelas matrisen värdet från Lista 1.
     
If Not IsError(Application.Match(vaData1(i, 1), vaData2, 0)) Then
        
ReDim Preserve lnTal(j)
         lnTal(j) = vaData1(i,
1)
         j = j +
1
     
End If
  
Next i

    Range("D2").Resize(UBound(lnTal)).Value = Application.Transpose(lnTal)

 End Sub