Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zwei Arrays vergleichen

Zwei Arrays vergleichen
24.01.2013 20:36:31
Gerd
Hallo,
ich suchen einen effizienten Weg, zwei Array zu vergleichen und Elemente zu löschen.
Folgende Situation:
1. es gibt ein eindimensionales Array A mit nummerischen Werten z.B. (23,45,64,3,2,6,..)
2. es gibt ein zweites, eindimensionales Array B mit nummerischen Werten (3, 4, 12, 23...)
3) ich möchte gern alle in Array B existierenden Elementen in Array A löschen
Dabei gilt:
- alle Elemente sind numerisch (long)
- die Elemente in den Arrays sind nicht sortiert
- in jedem Array sind ca. 50 - 10.000 Elemente
Leider kenne ich mich mit Array nicht aus. Der Lösungsweg ist egal, vielleicht sortiert man die Elemente erst und nimmt dann ein Schleife oder gibt es vielleicht so etwas wie ein INTERSECT im SQL ?
Viele Grüße,
Gerd

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
scripting.dictionary
24.01.2013 23:37:03
CitizenX
Hi,
Bsp:

Option Explicit
Sub test()
Dim arrA(), arrB(), i
Dim oDict: Set oDict = CreateObject("scripting.dictionary")
arrA = Application.Transpose(Range("A1:A25000").Value) 'dein ArrayA
arrB = Application.Transpose(Range("B1:B25000").Value) 'dein ArrayB
For i = 1 To UBound(arrA)
oDict(arrA(i)) = 0
Next
For i = 1 To UBound(arrB)
If oDict.exists(arrB(i)) Then oDict.Remove arrB(i)
Next
arrA = oDict.Keys
End Sub
Grüße
Steffen

Anzeige
AW: Zwei Arrays vergleichen
24.01.2013 23:44:12
Mustafa
Hallo Gerd,
ich weiss nicht ob das Effizient genug ist, aber so könnte es gehen
Sub ArrayVergleich()
Dim ArrayA(20), ArrayB(10)
Dim IntX As Integer, IntY As Integer
For IntX = LBound(ArrayA) To UBound(ArrayA)
For IntY = LBound(ArrayB) To UBound(ArrayB)
If ArrayA(IntX) = ArrayB(IntY) Then ArrayA(IntX) = ""
Next
Next
End Sub
Rückmeldung obs Hilft wäre nett.
Gruß aus der Domstadt Köln.

Anzeige
AW: Zwei Arrays vergleichen
27.01.2013 17:25:47
Gerd
Vielen Dank, ich glaube beide Lösungen funkionieren.
Ich bin noch dabei einen größeren Testfall aufzubauen und die Performance zu vergleichen.
Gerd
;
Anzeige
Anzeige

Infobox / Tutorial

Zwei Arrays vergleichen in Excel


Schritt-für-Schritt-Anleitung

Um zwei Arrays in Excel zu vergleichen und die Elemente zu löschen, kannst Du den folgenden VBA-Code verwenden. Dieser Code nutzt ein Dictionary-Objekt, um die Effizienz des Vergleichs zu erhöhen:

Option Explicit
Sub test()
    Dim arrA(), arrB(), i
    Dim oDict: Set oDict = CreateObject("scripting.dictionary")
    arrA = Application.Transpose(Range("A1:A25000").Value) 'dein ArrayA
    arrB = Application.Transpose(Range("B1:B25000").Value) 'dein ArrayB

    For i = 1 To UBound(arrA)
        oDict(arrA(i)) = 0
    Next

    For i = 1 To UBound(arrB)
        If oDict.exists(arrB(i)) Then oDict.Remove arrB(i)
    Next

    arrA = oDict.Keys
End Sub

In diesem Beispiel wird angenommen, dass Du zwei Arrays mit bis zu 25.000 Elementen hast, die in den Zellen A1 bis A25000 und B1 bis B25000 stehen.


Häufige Fehler und Lösungen

  1. Fehler: "Typenübereinstimmung"

    • Lösung: Stelle sicher, dass die Arrays korrekt initialisiert sind und die Datenformate übereinstimmen.
  2. Fehler: "Das Objekt ist erforderlich"

    • Lösung: Überprüfe, ob das Dictionary-Objekt korrekt erstellt wurde. Achte darauf, dass Du die Microsoft Scripting Runtime in den Verweisen aktiviert hast.
  3. Fehler: "Index außerhalb des gültigen Bereichs"

    • Lösung: Achte darauf, dass die Arrays nicht leer sind und die Indizes korrekt gesetzt sind.

Alternative Methoden

Eine alternative Methode zum Vergleichen von Arrays könnte die Verwendung von einfachen Schleifen sein. Hier ist ein einfaches Beispiel, wie Du zwei Arrays vergleichen kannst, ohne ein Dictionary zu verwenden:

Sub ArrayVergleich()
    Dim ArrayA(20), ArrayB(10)
    Dim IntX As Integer, IntY As Integer

    For IntX = LBound(ArrayA) To UBound(ArrayA)
        For IntY = LBound(ArrayB) To UBound(ArrayB)
            If ArrayA(IntX) = ArrayB(IntY) Then ArrayA(IntX) = ""
        Next
    Next
End Sub

Diese Methode ist jedoch weniger effizient, insbesondere bei großen Datenmengen.


Praktische Beispiele

Wenn Du beispielsweise die Schnittestellen zweier Spalten in Excel finden möchtest, kannst Du die oben genannten Methoden verwenden, um die nicht gemeinsamen Werte zu löschen. Nehmen wir an, Du hast in Spalte A die Werte (23, 45, 64, 3, 2, 6) und in Spalte B die Werte (3, 4, 12, 23). Der Code wird alle Werte in Array A löschen, die auch in Array B vorhanden sind.


Tipps für Profis

  • Optimierung: Wenn Du mit sehr großen Arrays arbeitest, kann es sinnvoll sein, vor dem Vergleich die Arrays zu sortieren. Dies kann die Effizienz des Vergleichs erheblich steigern.

  • Datenvalidierung: Stelle sicher, dass Deine Daten keine Duplikate enthalten, bevor Du mit dem Vergleich beginnst. Dies kann zu unerwarteten Ergebnissen führen.

  • Debugging: Verwende Debug.Print, um den Inhalt Deiner Arrays während der Entwicklung zu überwachen und sicherzustellen, dass die Werte korrekt sind.


FAQ: Häufige Fragen

1. Wie kann ich die Schnittestelle zweier Tabellen in Excel finden?
Du kannst die gleiche Methode wie oben beschrieben verwenden, um die Excel-Schnittmenge zweier Tabellen zu finden. Verwende die Transponierung, um die Daten in Arrays zu laden und vergleiche sie dann.

2. Ist es möglich, die Arrays in Excel ohne VBA zu vergleichen?
Ja, Du kannst auch Formeln wie VERGLEICH und WENN verwenden, um zu vergleichen, aber dies ist weniger effizient für große Datenmengen. VBA ist bei größeren Projekten oft die bessere Wahl.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige