Clever-Excel-Forum

Normale Version: VBA: 2 Arrays vergleichen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich habe ein File, auf dessen Basis wöchentlich ein Report an die anderen Abteilungen (Umsätze) versendet wird.
Dieses File beinhaltet alle gebuchten und reservierten Aufträge sowie welche Firmensparte den Umsatz "erzielt" hat bzw. bei Reservationen (hoffentlich) erzielen wird.
Da es von Woche zu Woche zu Änderungen kommt, haben die Rohdaten gut und gerne zu Jahresende 100'000 Zeilen (auch, da gewisse Aufträge doppelt vorkommen bzw. aufgrund gewisser Spezifikationen anders behandelt/geliefert werden als andere).

Mein Problem: Ich möchte gerne, dass ich die Datensätze der aktuellen Woche mit dem Datensatz der Vorwoche vergleichen kann, um zu schauen, welche Aufträge neu hinzugekommen, verändert oder komplett storniert wurden.

Ich habe es per VBA mit einer Schleife durch ein bzw. zwei Arrays versucht, jedoch dauerte dies in Spitzenzeiten bis zu 10 Minuten (trotzden MAssnahmen mit ScreenUpdating = false usw.). Basis für den Vergleich waren die ID's, jedoch kann es vorkommen, dass eine ID in der nächsten Woche gelöscht bzw. durch eine neue ersetzt wird, der Name jedoch gleich bleibt.

Mein Versuch bisher:
Code:
Dim ArrayAktuell As Variant
Code:
Dim ArrayVorwoche As Variant
Code:
Dim i As Long
Code:
Dim letzteZeile As Long
Code:
Dim ZeileEintrag As Long
Code:
'Sammelt die Daten der aktuellen Woche
Code:
With Tabelle2
Code:
  letzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
Code:
  ArrayAktuell = .Range(.Cells(2, 1), .Cells(letzteZeile, 5))
Code:
End With
Code:
'Sammelt die Daten der Vorwoche
Code:
With Tabelle1
Code:
  letzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
Code:
  ArrayVorwoche = .Range(.Cells(2, 1), .Cells(letzteZeile, 5))
Code:
End With
Code:
For i = 1 To UBound(ArrayAktuell)
Code:
 
Code:
  'Wenn ID gefunden
Code:
  If WorksheetFunction.Index(ArrayAktuell, Application.Match(ArrayAktuell(i, 1), ArrayVorwoche, 0)) > 0 Then
Code:
   
Code:
    'nichts passiert, da ok
Code:
 
Code:
  ElseIf WorksheetFunction.Index(ArrayAktuell, Application.Match(ArrayAktuell(i, 1), ArrayVorwoche, 0)) = 0 Then
Code:
   
Code:
    ZeileEintrag = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row + 1
Code:
   
Code:
    Tabelle3.Cells(ZeileEintrag, 1).Value = ArrayAktuell(i, 1)
Code:
   
Code:
  End If
Code:
 
Code:
Next i
Code:
End Sub


Allerdings bekomme ich immer die Fehlermeldung "Typen unverträglich", kann aber nicht dahintersteigen, warum der Fehler auftritt.

Bin was Arrays angeht noch nicht ganz fit und daher froh um Denkanstösse eurerseits.

Oder gibt es eine Formellösung, welche ich nicht auf dem Schirm hatte?

Danke euch schonmal für die Hilfe und nachträglich frohes neues Jahr.

Liebe Grüsse,
Domi
Hallo Domi,

wenn ich es richtig verstanden habe, dann so:
Code:
Private Sub cmdCheck_Click()
    Dim ArrayAktuell(), ArrayVorwoche()
    Dim i&, j&, letzteZeile&, ZeileEintrag&

    'Sammelt die Daten der aktuellen Woche
    With Tabelle2
        letzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
        ArrayAktuell = .Range(.Cells(2, 1), .Cells(letzteZeile, 5))
    End With

    'Sammelt die Daten der Vorwoche
    With Tabelle1
        letzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
        ArrayVorwoche = .Range(.Cells(2, 1), .Cells(letzteZeile, 5))
    End With

    For i = 1 To UBound(ArrayAktuell)
        If ArrayAktuell(i, 1) <> ArrayVorwoche(i, 1) Then
            ZeileEintrag = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row + 1
            For j = 1 To UBound(ArrayAktuell, 2)
                Tabelle3.Cells(ZeileEintrag, j).Value = ArrayAktuell(i, j)
            Next j
        End If
    Next i
End Sub
Gruß Uwe
Du brauchst kein VBA, nur:
- eine Spalte 'Woche'
- ein Pivottable

Dann siehst du unmittelbar die Löcher in Woche 1 und Woche 2
Hallo Uwe und snb,

sorry für meine späte Rückmeldung.

Danke für eure Vorschläge, werde diese am Montag einbauen wenn ich wieder im Büro bin und euch Feedback geben.

Danke nochmal!

LG Domi