Supportnet / Forum / Tabellenkalkulation
Jeden Wert zweier Spalten vergleichen
Frage
Hallo zusammen,
habe sehr wenig Erfahrung in Excel und VBA, deshalb suche ich ein wenig Hilfe. Folgendes Problem:
Ich möchte eine Spalte (ca 30.000 Zeilen) mit einer anderen Spalte (ca 50.000 Zeilen) vergleichen (jeden Wert mit jedem). Falls Werte doppelt vorkommen sollen alle markiert werden. Das war´s auch schon
Hoffe ihr könnt mir helfen
Gruß
Sharth
Antwort 1 von zero_-_-cool
Jou, das lässt sich am leichtesten mit VBA realisieren.
Es dauert zwar ein weilchen jeden mit jedem zu vergleichen bei der Anzahl, aber machbar isses.
Ich würde mir ein Modul anlegen und folgendes reintippeln:
Public Function vgl_Zeile ()
For i = 1 to Sheets("Tabelle1").UsedRange.Rows.Count
For i2 = 1 To Sheets.UsedRange.Rows.Count
If (Sheets("Tabelle1").Range("A" & i) = Sheets("Tabelle1").Range("B" & i2) Then
Sheets("Tabelle1").Range("A" & i).Select
Selection.Interior.ColorIndex = 3
End If
Next i2
Next i
End Function
Habs jetzt nicht ausprobiert, viel. liegt irgendwo n Syntaxfehler vor. Aber vom Prinzip her funktioniert es so. Evtl. kennt jemand nen Weg der schneller geht.
Es dauert zwar ein weilchen jeden mit jedem zu vergleichen bei der Anzahl, aber machbar isses.
Ich würde mir ein Modul anlegen und folgendes reintippeln:
Public Function vgl_Zeile ()
For i = 1 to Sheets("Tabelle1").UsedRange.Rows.Count
For i2 = 1 To Sheets.UsedRange.Rows.Count
If (Sheets("Tabelle1").Range("A" & i) = Sheets("Tabelle1").Range("B" & i2) Then
Sheets("Tabelle1").Range("A" & i).Select
Selection.Interior.ColorIndex = 3
End If
Next i2
Next i
End Function
Habs jetzt nicht ausprobiert, viel. liegt irgendwo n Syntaxfehler vor. Aber vom Prinzip her funktioniert es so. Evtl. kennt jemand nen Weg der schneller geht.
Antwort 2 von Saarbauer
Hallo,
ich habe das Makro etwas überarbeiten
Public Function Zeilen_vergleichen()
Range("A1").Select
Endi = Range("A65536").End(xlUp).Row
Range("B1").Select
Endj = Range("A65536").End(xlUp).Row
For i = 1 To Endi
For j = i To Endj
If Range("A" & i) = Range("B" & j) Then
Range("B" & j).Select
Selection.Interior.ColorIndex = 3
End If
Next j
Next i
End Function
Es weden die Daten in Spalte A und Spalte B verglichen
Solten die Daten anders angeordnet sein, wäre dies abzuändern. Sollen die Daten in Spalte A bzw. B auch intern auf Doppelte geprüft werden, dann wäre dies noch zu ergänzen
Gruß
Helmut
ich habe das Makro etwas überarbeiten
Public Function Zeilen_vergleichen()
Range("A1").Select
Endi = Range("A65536").End(xlUp).Row
Range("B1").Select
Endj = Range("A65536").End(xlUp).Row
For i = 1 To Endi
For j = i To Endj
If Range("A" & i) = Range("B" & j) Then
Range("B" & j).Select
Selection.Interior.ColorIndex = 3
End If
Next j
Next i
End Function
Es weden die Daten in Spalte A und Spalte B verglichen
Solten die Daten anders angeordnet sein, wäre dies abzuändern. Sollen die Daten in Spalte A bzw. B auch intern auf Doppelte geprüft werden, dann wäre dies noch zu ergänzen
Gruß
Helmut
Antwort 3 von Saarbauer
Hallo,
ist mir gerade eingefallen, dass bei unsortierten Daten, in dieser Zeile
For j = i To Endj
i durch 1 zu ersetzen ist.
Gruß
Helmut
ist mir gerade eingefallen, dass bei unsortierten Daten, in dieser Zeile
For j = i To Endj
i durch 1 zu ersetzen ist.
Gruß
Helmut
Antwort 4 von sharth2003
Danke für eure schnellen Antworten.
Aber ich befürchte bei der Anzahl der Zeilen ist diese Lösung nicht geeignet, jedenfalls stürzt Excel jedesmal beim ausführen ab. Mit weniger Zeilen funktioniert das Makro bestens. Habt ihr noch eine Variante, die funktionieren könnte. Geht es überhaupt alleine mit Excel?
Gruß,
Sharth
Aber ich befürchte bei der Anzahl der Zeilen ist diese Lösung nicht geeignet, jedenfalls stürzt Excel jedesmal beim ausführen ab. Mit weniger Zeilen funktioniert das Makro bestens. Habt ihr noch eine Variante, die funktionieren könnte. Geht es überhaupt alleine mit Excel?
Gruß,
Sharth
Antwort 5 von Saarbauer
Hallo,
was soll den mit den markierten Zeilen passieren?
Vielleicht gibt es über diesen Weg eine Lösung
Gruß
Helmut
was soll den mit den markierten Zeilen passieren?
Vielleicht gibt es über diesen Weg eine Lösung
Gruß
Helmut
Antwort 6 von nightdream
Hallo zusammen,
ich hatte eine ähnliche Aufgabe mit folgender Excelformel lösen können. Ich habe sie in der Tabelle2 in Spalte B eingesetzt. Hier wird mir dann angezeigt, ob der Datensatz aus Tabelle2 auch in Tabelle1 auftaucht. Vergleichskriterium ist Spalte A.
=WENN(ISTNV(SVERWEIS(A1;Tabelle1!A:A;1;FALSCH));"ja";"nein")
Die Formel entsprechend in die anderen Zellen kopieren.
So sollte es eigentlich funktionieren.
Gruss
nightdream
ich hatte eine ähnliche Aufgabe mit folgender Excelformel lösen können. Ich habe sie in der Tabelle2 in Spalte B eingesetzt. Hier wird mir dann angezeigt, ob der Datensatz aus Tabelle2 auch in Tabelle1 auftaucht. Vergleichskriterium ist Spalte A.
=WENN(ISTNV(SVERWEIS(A1;Tabelle1!A:A;1;FALSCH));"ja";"nein")
Die Formel entsprechend in die anderen Zellen kopieren.
So sollte es eigentlich funktionieren.
Gruss
nightdream
Antwort 7 von rainberg
Hallo shart2003,
habe folgendes Makro mit je 10000 Werten in den Spalten A und B getestet.
Laufzeit ca. 40sek
Du kannst damit auch beliebig mehr Zeilen vergleichen, ist halt nur eine Frage der Zeit.
Die Werte befinden sich in den Spalten A und B.
Gruß Rainer
habe folgendes Makro mit je 10000 Werten in den Spalten A und B getestet.
Laufzeit ca. 40sek
Du kannst damit auch beliebig mehr Zeilen vergleichen, ist halt nur eine Frage der Zeit.
Die Werte befinden sich in den Spalten A und B.
Option Explicit
Sub vergleichen()
Dim lngI As Long, intWert As Integer
Application.ScreenUpdating = False
For lngI = 1 To Cells(Rows.Count, 1).End(xlUp).Row
intWert = Application.WorksheetFunction. _
CountIf(Worksheets("Tabelle1").Range("B:B"), Cells(lngI, 1).Value)
If intWert > 0 Then
Cells(lngI, 1).Interior.ColorIndex = 3
End If
Next lngI
Application.ScreenUpdating = True
End SubGruß Rainer
Antwort 8 von nighty
hi al :)
wie gewünscht :)
gruss nighty
Option Explicit
Sub makro01()
Dim bereich As String
Dim zeile As Long
Dim suche As Range
For zeile = 2 To Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set suche = Sheets(2).Range("A2" & ":A" & Sheets(2).UsedRange.SpecialCells(xlCellTypeLastCell).Row). _
Find(Sheets(1).Range("A" & zeile), LookIn:=xlValues)
If Not suche Is Nothing Then
bereich = bereich & Sheets(1).Range("A" & zeile).Address & ","
End If
Next zeile
Sheets(1).Range("" & Mid(bereich, 1, Len(bereich) - 1)).Select
End Sub
wie gewünscht :)
gruss nighty
Option Explicit
Sub makro01()
Dim bereich As String
Dim zeile As Long
Dim suche As Range
For zeile = 2 To Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set suche = Sheets(2).Range("A2" & ":A" & Sheets(2).UsedRange.SpecialCells(xlCellTypeLastCell).Row). _
Find(Sheets(1).Range("A" & zeile), LookIn:=xlValues)
If Not suche Is Nothing Then
bereich = bereich & Sheets(1).Range("A" & zeile).Address & ","
End If
Next zeile
Sheets(1).Range("" & Mid(bereich, 1, Len(bereich) - 1)).Select
End Sub
Antwort 9 von nighty
hi all :)
die zeichenanzahl der adressen sprengt den rahmen der selectierung,daher so nicht anwendbar ist,alternativ rainers vorschlag der einfaerbug,wobei ein erneutes starten in wechselwirkung arbeiten sollte um die farben zurueckzusetzen,kommt morgen oder von anderen usern :))
gruss nighty
die zeichenanzahl der adressen sprengt den rahmen der selectierung,daher so nicht anwendbar ist,alternativ rainers vorschlag der einfaerbug,wobei ein erneutes starten in wechselwirkung arbeiten sollte um die farben zurueckzusetzen,kommt morgen oder von anderen usern :))
gruss nighty
Antwort 10 von rainberg
Hallo nighty,
das Zurücksetzen der Farben halte ich nicht für erforderlich, geht ja auch per Hand sehr schnell.
Aber wäre natürlich nicht das Problem.
Einfach unter die Zeile
diese Zeile einfügen
Das größere Problem ist die Laufzeit meines Codes.
Bei 50.000 Werten in Spalte A und 30.000 Werten in Spalte B komme ich auf 7 min und 20 s.
Die Frage ist nun, gibt es eine schnellere Methode als CountIf?
Gruß Rainer
das Zurücksetzen der Farben halte ich nicht für erforderlich, geht ja auch per Hand sehr schnell.
Aber wäre natürlich nicht das Problem.
Einfach unter die Zeile
Application.ScreenUpdating = Falsediese Zeile einfügen
Columns("A:A").Interior.ColorIndex = xlNone
Das größere Problem ist die Laufzeit meines Codes.
Bei 50.000 Werten in Spalte A und 30.000 Werten in Spalte B komme ich auf 7 min und 20 s.
Die Frage ist nun, gibt es eine schnellere Methode als CountIf?
Gruß Rainer

