Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
804to808
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Tabellen vergleichen... nicht doppelte ausgeben

Tabellen vergleichen... nicht doppelte ausgeben
21.09.2006 12:52:49
Sebastian
Guten Tag zusammen,
Ich möchte gerne zwei Excel-Tabellen miteinander vergleichen, anhand der dort hinterlegten drei Spalten die in den beiden Tabellen identisch sein sollten, sind sie aber nicht bis auf ein paar Datensätze.
Als Ergebnis hätte ich gern eine Auflistung der Datensätze, die nicht in beiden Tabellen vorkommen.
Ich habe mir da mal mit Hilfe was geschrieben... und ich betone mit Hilfe da ich echt von VBA sehr wenig bis gar kein Plan habe!
Also ich habe das jetzt so gemacht, dass ich in einer Mappe, beide Tabellen habe... Tabelle1 und Tabelle2... und ich möchte das er mir die die nicht in den beiden Tabellen doppelt sind in Tabelle3 ausgibt.
Joa, also ich denke/hoffe/glaube das das was ich da gebastelt habe funzt, aber das is schwer zu sagen, weil die beiden Tabellen fast 60000 Zeichenzätze je drei Spalten besitzen... habe das jetzt schon mal fast ne Stunde laufen lassen... und joa... ihr versteht die Richtung glaube ich :-P Viel Eier Uhr wenig Ergebnis!
Ich poste mal den Code:

Private Sub CommandButton1_Click()
' Vergleicht Tabelle 2 mit Tablle 1 und schreibt Werte
' aus Tabelle 2, die in Tabelle 1 nicht vorkammen in Tabelle 3
Dim verg1(60000), verg2(60000), dopp%(60000), num(60000)
' Tabelle 1 einlesen
Worksheets("Tabelle1").Activate
y = 2
Do While Cells(y, 1) <> ""
verg1(y) = Cells(y, 2)
y = y + 1
Loop
' Tabelle 2 einlesen
Worksheets("Tabelle2").Activate
z = 2
Do While Cells(z, 1) <> ""
num(z) = Cells(z, 1)
verg2(z) = Cells(z, 2)
z = z + 1
Loop
For r = 2 To y - 1
For s = 2 To z - 1
If r = s Then s = s + 1
If verg1(r) = verg2(s) Then 'And dopp(s) = 0
dopp(s) = 1
Cells(s, 3) = "gleich"
End If
Next s
Next r
' In Tabelle 3 schreiben
Worksheets("Tabelle3").Activate
zz = 1
For u = 1 To z - 1
If dopp(u) = 0 Then
Cells(zz, 1) = num(u)
Cells(zz, 2) = verg2(u)
zz = zz + 1
End If
Next u
End Sub

Hab ich da was falsch gemacht oder ist das einfach der falsche Weg um so viele Datensätze zu vergleichen?
Cool wäre so ne Art Status der mir immer sagt "Sei geduldig 1... sei geduldig 2 usw. das ich sehe, dass was läuft, oder?!
Gruß

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellen vergleichen... nicht doppelte ausgeben
21.09.2006 13:10:54
Oberschlumpf
Hallo Sebastian
Wenn ich dich richtig verstanden habe, dann sind in beiden Tabellen 60.000 Einträge.
Und diese 2 x 60.000 Einträge sollen miteinander verglichen werden - jeder mit jedem.
Ohne, dass ich mir jetzt deinen Code genauer angesehen habe, ergibt sich für mich daraus diese Rechnung:
Angenommen, der PC benötigt pro Vergleich = 1 Millisekunde:
60.000 x 60.000 = 3.600.000.000 Millisekunden (3,6 Milliarden!)
3.600.000.000 / 1000 = 3.600.000 Sekunden
3.600.000 / 60 = 60.000 Minuten
60.000 / 60 = 1.000 Stunden = 41,67 Tage! :-)
Angenommen, der PC benötigt pro Vergleich = 1 Mikrosekunde:
60.000 x 60.000 = 3.600.000.000 Mikrosekunden (3,6 Milliarden!)
3.600.000.000 / 1000 = 3.600.000 Millisekunden
3.600.000 / 1000 = 3.600 Sekunden
3.600 / 60 = 60 Minuten
60 / 60 = 1 Stunde :-)
Da ich gerad mal keine 2 Dateien mit á 60.000 Einträgen habe :-), kann ich leider keinen Code dafür/damit entwickeln/testen.
Trotzdem weiter viel Glück!
Ciao
Thorsten
Anzeige
AW: Tabellen vergleichen... nicht doppelte ausgeben
21.09.2006 13:16:10
Sebastian
Hehe :D :D :D
Das baut sehr auf!
Und ich habe gerade nochmal nachgeschaut... in der größeren der beiden Tabellen sind es genau 63547 Einträge in je drei Spalten... joa und das dann fast mal 2, weil sind ja zwei! :D :D Toll wa...?!
vergiss meinen ersten Beitrag :-)
21.09.2006 13:23:21
Oberschlumpf
Hi
Hab gerad mal ERST überlegt - jetzt noch mal geantwortet :-)
Ein aktueller PC braucht pro Rechenoperation nicht 1 Millisekunde und auch nicht 1 Mikrosekunde.
Mein PC z Bsp ist mit 2,66 GHz getaktet, was bedeutet, dass er pro Sekunde 2.660.000.000 (2,66 Milliarden) Rechenoperationen durchführen kann - das wiederum bedeutet, dass in nur 1 Mikrosekunde = 2660 Rechenoperationen und NICHT NUR 1, wie ich erst annahm, möglich sind.
Somit ergibt sich ein ganz anderes, aber viel schnelleres Ergebnis, als das, was ich zuerst annahm.
Und nun versuche ich trotzdem mal einen Code - der kommt später.
Ciao
Thorsten
Anzeige
AW: vergiss meinen ersten Beitrag :-)
21.09.2006 14:07:52
Oberschlumpf
Hallo
Ich habe zwar etwas gebastelt, aber zufriedenstellend ist das auch nicht.
Code-Abbruch nach ca. 10 Minuten Laufzeit ergab, dass die erste Schleife erst bei dem Wert 3457 (von 60.000) war :-(
Zugrunde liegen diese 2 Tabellen in einer Excel-Datei:
Tabelle 1:
in Spalte A die werte 1 - 60000
Tabelle 2:
in Spalte A die werte 1 - 60000, wobei jede 1000. Zelle einen Wert enthält, der NICHT in Tabelle 1 vorkommt.
der Code:

Sub vergleich()
Dim ldbSuche As Double, ldbSuche2 As Double, ldbZeile As Double, ldbZeile2 As Double, lboTreffer As Boolean
Dim ldtStart As Date
ldtStart = Time
ldbZeile = 1
For ldbSuche = 1 To 60000
For ldbSuche2 = 1 To 60000
If Sheets(2).Range("A" & ldbSuche).Value = Sheets(1).Range("A" & ldbSuche2).Value Then
lboTreffer = True
Exit For
Else
ldbZeile2 = ldbSuche
End If
Next
If lboTreffer = True Then
lboTreffer = False
Else
Sheets(3).Range("A" & ldbZeile).Value = Sheets(2).Range("A" & ldbZeile2).Value
ldbZeile = ldbZeile + 1
End If
Debug.Print ldbSuche
Next
ldtStart = Time - ldtStart
MsgBox "fertig - Dauer: " & ldtStart
End Sub

Wie gesagt, das ist auch nicth der Bringer - aber vllt hat ja jemend anderer durch meinen Code einen Denkanstoß, mit dem es schneller geht.
Ciao
Thorsten
Anzeige
AW: vergiss meinen ersten Beitrag :-)
21.09.2006 14:17:22
Sebastian
Hallo Thorsten,
ich danke dir erstmal für deine Mühen!!!
Vielleicht ereilt mich ja noch eine Hilfe die Performancemäßig besser ist, habe meine Lösung eben gerade mal mit nur 2000 Zellen je Tabelle getestet und das hat schon ein bisschen gedauert... und mir ist mal gerade aufgefallen, dass er mir die ungleichen Klamotten gar nicht in die dritte Tabelle ausgibt, da muss ich nochmal gucken, aber ich werde deine Lösung nun auch mal testen...
Vielen Dank nochmal!!!
Gruß
Sebastian
AW: Laufzeit bei Vergleich
21.09.2006 22:16:25
ingUR
Hallo, Sebastion,
so einfach läßt sich m.E. die vermutlich benötigte Zeit nicht abschätzen, wenn man die Datenstruktur nicht kennt. Für einen Versuch mit Zahlen benötige ich ca. 3,33 Min. für die ersten ca. 3000 Datensätze der Tabelle1, die jeweils mit jedem der 60.000 Datensätze der Tabelle2 verglichen wird, sofern nicht zuvor eine Übereinstimmung aller drei Spaltenwerte festgesellt wird.
Mit zunehmender Datensatzzahl wird die Zeit sich noch erhöhen, da Deine Vorgabe vorsieht, alle Datenzeilen der Tabelle2 zu vergleichen, also immer wieder ab der ersten Datenzeile, auch wenn diese bereits in Tabelle1 entdeckt wurde (s.u.).
Als Datenbasis werden zwei Datenreihen benutzt, die jeweils aus 60.000 Datenzätzen a drei Elementen je Datensatz bestehen, mit 382 unterschiedlichen Datensätzen in den beiden Reihen.
Option Explicit
Sub Vergleich()
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Dim mark As Long
Dim lastR1 As Long, lastR2 As Long, lastR As Long
Dim r1 As Long, r2 As Long, c As Integer, i As Integer
Set ws1 = Worksheets("Tabelle1")
Set ws2 = Worksheets("Tabelle2")
Set ws3 = Worksheets("Tabelle3")
ws3.Cells.ClearContents
lastR1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
lastR2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
ws1.Select
Dim oldStatusBar
Dim found As Boolean
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Dim StartZeit As Date, EndeZeit As Date, Zeit As Date, msg As String
StartZeit = Time
For r1 = 2 To lastR1
For r2 = 2 To lastR2
found = False
For c = 1 To 3
If Not (Cells(r1, c) = ws2.Cells(r2, c)) Then Exit For
Next c
If c > 3 Then
found = True
Exit For
End If
Next r2
If Not found Then
'Zeile r1 in Tabelle 2 nicht gefunden
mark = mark + 1
ws3.Cells(mark + 1, 1) = r1
For i = 1 To 3
ws3.Cells(mark + 1, i + 1) = Cells(r1, i)
Next i
End If
'Statuszeile aktuallisieren nach jeweil 100 Zeilen in Tabelle1
If (r1 - 1) = 100 * CInt((r1 - 1) / 100) Then
Zeit = Time - StartZeit
msg = r1 - 1 & "/" & lastR1 - 1 & _
" (" & Format((r1 - 1) / (lastR1 - 1), "0.0%") & _
") Zeit:" & Zeit & _
" (Restzeit ~ " & Format((lastR1 - r1 + 1) * (Time - StartZeit) / (r1 - 1), "hh:mm:ss") & ")"
Application.StatusBar = msg
End If
Next r1
Application.StatusBar = False
Application.DisplayStatusBar = oldStatusBar
Set ws1 = Nothing
Set ws2 = Nothing
Set ws3 = Nothing
End Sub

Der Programmcode enthält eine Statuszeileneinblendung mit der Verlaufsinformation, die natürlich auch Berechnungszeit benötigt. Jedoch der Hauptzeitgewinn könnte möglicherweise durch Überprüfung der Struktur der zu vergleichenden Daten erzielt werden. So ist zu überlegen,
  • ob übereinstimmende Zeilen erneut untersucht werden müssen,
  • ob über eine Sortierung beider Listen, das Durchsuchen der Liste2 nicht immer am Beginn der Liste gestartet werden muß.
    Gruß,
    Uwe
  • Anzeige
    AW: Laufzeit bei Vergleich - Korrektur
    21.09.2006 22:48:41
    ingUR
    Korrektur:
    'Statuszeile aktuallisieren nach jeweil 100 Zeilen in Tabelle1
    If (r1 - 1) = 100 * CLng((r1 - 1) / 100) Then

    303 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige