EXCEL VBA: Zwei Tabellen miteinander Vergleichen - Statt Zeilen markieren soll VBA Zellen markieren

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich habe mir Zeit dafür genommen und dir etwas einfaches aber funktionierendes getippert.

Versuche es mal hier mit:

Dim lRowTab1 As Long
Dim iCol As Integer

For lRowTab1 = 1 To 500
  For iCol = 1 To 400
    If Cells(lRowTab1, iCol) <> Worksheets("Tabelle2").Cells(lRowTab1, iCol) Then
      Cells(lRowTab1, iCol).Interior.ColorIndex = 6
    End If   
  Next iCol
Next lRowTab1

Noch eine Anmerkung. Nach dem, was ich analysiert habe, wertet der von dir aufgeführte, sehr lange Code, nur die erste Zeile aus. Teilweise habe ich nicht ganz nachvollziehen können, warum es aufgebaut wurde wie es ist.

Kannst du bitte eine Rückmeldung geben, ob der Code auch bei dir läuft!? Es gibt zumindest keinen erkennbaren Grund, warum es nicht so sein sollte.

Grüße, Kurt

0
@Toraka

Noch eine Verbesserungsidee: Lege doch im If einen Else-Zweig an, in dem du die Anweisung direkt unter der If-Zeile wiederholst, lediglich ganz hinten die Ziffer für die Farbe auf weiss stellst!? So könntest du den Vergleich nach jeder Änderung wiederholen, zuvor abweichende, nun identische Felder, würden somit auf weiss gestellt.

Und, schon ausprobiert?

0
@Toraka

Hi, danke für deine Mühe! Werde deinen Code gleich ausprobieren!

0
@Toraka

Das funktioniert schon mal. VIELEN VIELEN DANK!!!!!

Leider hat sich ein neues Problem ergeben, was ich nicht bedacht habe. Wenn bei den Tabellen, die verglichen werden, bei der einen Tabelle eine Zeile hinzugefügt wurde, ist alles danach gelb (obwohl evtl die Daten ausgenommen der einen Zeile alles gleich ist). Kann man da was machen, oder zu kompliziert?

0
@TimmTomm

Das ist genau das, was ich anfangs bereits erwähnte. Für einfache Vergleiche reicht der Code. Für komplexere Vergleiche ist ein intelligenterer Code notwendig. Die Zeilen müssten gemerkt, zum Beispiel Hashtabelle, und mit Hilfe derer verglichen werden.

Du wirst bald auf noch mehr Probleme stoßen. Etwa ein Leerzeichen mehr, Groß- und Kleinschreibung, andere Zeilenpositionen, z.B. anstatt in Zeile 5 in Zeile 8.

Dafür würde ich entweder eine fertige Lösung aus dem Netz verwenden oder eben tatsächlich selber coden, dann aber wohl eher in einer NET-Sprache.

Gerne würde ich dir auch dabei helfen, doch muss ich mit meiner Arbeit fertig werden, habe dafür keine Zeit.

0
@Toraka

Ja, das verstehe ich. Komischerweise hat mein Urspungscode keine Probleme damit gehabt. Hat also die Zeilen, die unter neu hinzugefügten Zeilen vorhanden, weiterhin verglichen und als Dublette erkannt. Warum weiß ich nicht, habe ich ja ebenfalls aus dem Netz kopiert....

0
@TimmTomm

Ich kann nachher nochmals drüber schauen, ob ich nicht noch ein paar Tricks integrieren kann. Was den Code aus dem Netz betrifft, bin ich verwundert, dass es überhaupt funktioniert.

0
@TimmTomm

Der Code aus dem Netz ignoriert die Zeilen einfach, die in der Anzahl mehr vorhanden sind. Ansonsten vergleicht es stur (und dumm) eine Zeile mit allen(!) der anderen Tabelle, was in die Zeit geht. Wenn dir Zeit unwichtig ist, das wäre schnell erweitert. Ob VBA Hashtables unterstützt, weiss ich aus Anhieb nicht, mir fällt aber ganz sicher eine Lösung ein, auch was Leerzeichen und Gross- und Kleinschreibung betrifft. In ungefähr 1 bis 2 Stunden kannst du nochmals hier rein schauen. Und danke für die Bewertung, das ist wenigstens ein kleines Feedback, viele nehmen sich die Lösung und verschwinden wieder. Ein bisschen Anreiz, und wenn es nur ein virtueller Dank mittels Bewertung ist, muss der Mensch ja haben! ;-)

0
@TimmTomm

WICHTIGE FRAGE

Was hast du denn für Daten? Kann ich davon ausgehen, dass alle Daten einer Zeile zusammen gehören? Zum Beispiel wie folgt:

Datum von   Datum bis   Anzahl   etc
11.03.2014  12.03.2014  2        ...
11.03.2014  12.03.2014  2        ...

Das ist wichtig für die Art und Weise des Vergleichs. Immerhin könnte man eine Zelle von der einen Tabelle nehmen und schauen, ob der Inhalt irgendwo(!) in der anderen Tabelle vorkommt. Sind es aber zusammenhängende Daten wie in der Beispieltabelle, dann müssen die Daten zeilenweise, nicht zellenweise, verglichen werden. Die meisten Tabellen sind zeilenweise aufgebaut, also genau so, wie in meiner Beispieltabelle.

0
@Toraka

Wenn du keine Spalte hast, anhand eine Zeile eindeutig identifiziert werden kann, zum Beispiel eine ID, einen Mitarbeiternamen, irgendetwas, kann jede Zeile links jede Zeile rechts sein. In diesem Fall ist nicht bekannt, an welcher Position denn nun wirklich ein Fehler ist. Du möchtest aber die Markierung der Spalte, in der der Fehler positioniert ist. Das ist ohne eindeutige Identifizierung der Zeile nicht möglich. Man könnte höchstens schauen, welche Spalte die meisten Übereinstimmungen aufweist und anhand derer die fehlerhaften Spalten markieren.

Ohne eindeutige Identifizierung, bei der die Position innerhalb der Tabelle für den Vergleich egal wäre, kann nur die ganze Zeile als "nicht gefunden" markiert werden, nicht aber einzelne Zellen.

Ich habe hier einiges ausprobiert. Aber ohne genaue Informationen über die Art der Daten, kann ich nichts spezifisches Entwickeln. Gehe ich in die eine Richtung, stellt sich nachher heraus, dass es anders hätte sein müssen. Deshalb möchte ich nicht weitere Zeit investieren, bevor ich nichts näheres über die Daten weiss.

0
@Toraka

Hi nochmal. Ja, es handelt sich genau um solche daten wie in deiner Beispielstabelle...

Na, das ist ja das Mindeste, was ICH für DICH tun konnte mit dem Stern. Genauso ungewöhnlich ist es, nachdem man den Stern schon erhalten hat, trotzdem noch Zeit zu investieren. Also großes Lob!

0
@Toraka

Die Zeit fand ich gar nicht so übermäßig lang. Daher wäre eine einfache und schnelle Lösung auch völlig ok! Hauptsache, du musst dich nicht mehr so lange mit mir aufhalten :-)

0

Ganz so schnell steige ich da nicht durch, vor allem, weil Einrückungen fehlen, dadurch umständlich zu erkennen ist, was wohin und zusammen gehört.

Ich habe aber einen spontanen Einfall, der nichts zerstört, aber funktionieren könnte:

Klammere die 5 Zeile von unten mit einem Hochkomma " ' "davor aus, so dass sie ignoriert und als Kommentar interpretiert wird. Du weisst doch sicher, wie das geht. Anschliessend schreibe unter- oder oberhalb davon:

Cells(lRow, iCol).Interior.ColorIndex = 6

Kannst du bitte eine Rückmeldung geben, ob es funktioniert hat? Wenn nicht, einfach wieder herauslöschen und das Hochkomma entfernen, so dass die alte Zeile wieder aktiv ist.

Das sollte syntaktisch auf jeden Fall klappen:

Range(Cells(lRow, iCol), Cells(lRow, iCol)).Interior.ColorIndex = 6

Wenn es dann auch noch mit der Markierung klappt, wäre das super. Ich habe gerade nichts parat, womit ich Code und Excel-Syntax nachvollziehen kann.

Ausklammerung der alten Zeile mit Hochkomma oder "rem " davor:

'Range(Cells(lRow, 1), Cells(lRow, 400)).Interior.ColorIndex = 6
0
@Toraka

Hi, danke für deine Mühen. Leider klappt es nicht und nur die erste Spalte wird markiert! :-(

0
@TimmTomm

Ja, schade, dann werde ich mir das nochmals in Ruhe ansehen, um die Logik verstehen zu können. Heute Abend gegebenenfalls.

Grundsätzlich meine ich, der Code ist ohnehin etwas umständlich. Darüber hinaus sind so natürlich nur direkte Vergleiche von Zeile zu Zeile möglich. Wenn mehr Intelligenz rein soll, ist weit mehr Aufwand notwendig. Dann würden z.B. Leerzeilen ignoriert, Groß- und Kleinschreibung, es gibt viele Möglichkeiten der Erweiterung. Aber, wie erwähnt, ist das aufwändig.

Muss es denn eine Eigenentwicklung sein? Es wird sicher bereits fertige Freeware für diese Aufgabe geben. Ich werde mich mal umsehen und gebe dir ggf. Bescheid.

0
@Toraka

Oh, die Kommentare hier hab ich eben erst gesehen. Nein, es muss keine Eigenentwicklung sein! Ich schau mir die Links mal an. Danke nochmal für alles!

0

Was möchtest Du wissen?