Anzeige
Archiv - Navigation
1636to1640
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
Inhaltsverzeichnis

Vergleich von zwei Tabellen

Vergleich von zwei Tabellen
10.08.2018 11:44:14
zwei
Guten Tag zusammen,
ich möchte bei zwei Tabellen die erste Spalte vergleichen und dann die nicht doppelten Einträge in eine dritte Tabelle kopieren. Folgenden Code habe ich in einem anderen Forum gefunden. Er funktioniert auch super. Das einzige Problem ist, dass bei diesem Code das Einfügen der nicht doppelten Einträge in Tabelle Zelle1 kopiert wird. Ich hätte gerne, dass das Einfügen in der Tabelle 3 in Zelle B4 startet. Wo genau muss ich dann bei diesem Code was abändern. Ich bin VBA Anfänger und bin dankbar für jede Hilfe.
Option Explicit
Dim tt As Integer
Sub Master()
Dim i As Integer
tt = 0
´ Hier die Anzahl der Spalten eingegben (z.B.: 3):
For i = 1 To 3
Call Vergleich(i)
Next
End Sub

Function Vergleich(akspa As Integer)
Dim verg1(5000) As String
Dim verg2(5000) As String
Dim merk1(5000) As String
Dim merk2(5000) As String
Dim z As Integer
Dim y As Integer
Dim r As Integer
Dim s As Integer
Dim t As Integer
Dim v As Integer
z = 2
Do While Worksheets("Tabelle1").Cells(z, akspa)  ""
verg1(z) = Worksheets("Tabelle1").Cells(z, akspa)
z = z + 1
Loop
´ Werte aus Tabelle 2 einlesen
y = 2
Do While Worksheets("Tabelle2").Cells(y, akspa)  ""
verg2(y) = Worksheets("Tabelle2").Cells(y, akspa)
y = y + 1
Loop
´ Werte vergleichen
r = 1
s = 1
For r = 1 To z - 1
For s = 1 To y - 1
´ Gleiche Werte markieren
If verg1(r) = verg2(s) Then merk1(r) = "ja"
If verg2(s) = verg1(r) Then merk2(s) = "ja"
Next s
Next r
´ Ungleiche Werte aus Tabelle 1 ausgeben
t = 1
For t = 1 To r
If merk1(t)  "ja" Then
tt = tt + 1
Worksheets("Tabelle2").Select
Worksheets("Tabelle2").Rows(t).Copy
Worksheets("Tabelle3").Select
Worksheets("Tabelle3").Cells _
(tt, 1).Select
ActiveSheet.Paste
End If
Next t
´ Ungleiche Werte aus Tabelle 2 ausgeben
v = 1
For v = 1 To s
If merk2(v)  "ja" Then
tt = tt + 1
Worksheets("Tabelle2").Select
Worksheets("Tabelle2").Rows(v).Copy
Worksheets("Tabelle3").Select
Worksheets("Tabelle3").Cells _
(tt, 1).Select
ActiveSheet.Paste
End If
Next v
Application.CutCopyMode = False
End Function
Vielen Dank!

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vergleich von zwei Tabellen
10.08.2018 13:29:23
zwei
Hi,
ohne näher auf den Code einzugehen:
tt = 0
änderst Du in
tt = 3
Und hier
Worksheets("Tabelle3").Cells _
(tt, 1).Select
änderst Du jeweils die Spalte 1 (= A) auf 2 (=B)
VG, Boris
AW: Vergleich von zwei Tabellen
10.08.2018 13:46:25
zwei
Danke für die schnelle Rückmeldung. Ich weiß nicht genau wo ich es ändern soll. tt = 0 kann ich nirgendwo im Code finden. Ich habe nun tt = tt + 1 abgeändert aber da kommt dann leider ein Fehler.
Herzlichen Dank für Ihre Hilfe!
AW: Vergleich von zwei Tabellen
10.08.2018 14:12:14
zwei
Hi,
Sub Master()
Dim i As Integer
tt = 0
´ Hier die Anzahl der Spalten eingegben (z.B.: 3):
VG, Boris
Anzeige
AW: Vergleich von zwei Tabellen
13.08.2018 10:21:50
zwei
Vielen Dank, nur leider kommt dann ein Fehler und das Makro läuft gar nicht mehr. Beim Debuggen wird immer ActiveSheet.Paste gelb hinterlegt. Haben Sie noch eine andere Lösung/Möglichkeit für das was ich haben möchte?
Vielen Dank vorab!
Ich denke, der Code läuft (lief)...
13.08.2018 11:32:18
{Boris}
Hi Lara,
...einwandfrei?
An der Änderung kann es nicht liegen.
Du kannst mal eine anonymisierte Beispieldatei hier hochladen - dann wird es einfacher.
VG, Boris
AW: Ich denke, der Code läuft (lief)...
13.08.2018 15:09:41
Lara
Hallo Boris,
irgendwie läuft der Code jetzt doch nicht einwandfrei...danke für deine Zeit. Im Anhang findest du eine Beispieldatei. Es soll jeweils Spalte A von Tabelle 1 und Tabelle 2 verglichen werden. In Tabelle 2 sind jetzt zum Beispiel 4 Einträge von Tabelle 1 nicht mehr dabei und ein neuer Eintrag. Diese sollen dann alle in Tabelle 3 aufgeführt werden. Hab ich es verständlich erklärt?
https://www.herber.de/bbs/user/123308.xlsm
Lg, Lara
Anzeige
AW: Ich denke, der Code läuft (lief)...
13.08.2018 16:23:43
{Boris}
Hi Lara,
der Code ist - ich sag`s mal so - sehr suboptimal ... ;-))
Ich hab Dir mal ein einfaches Beispiel gebastelt - und es extra etwas übersichtlicher gehalten.
Das funktioniert jetzt für Deine Beispieldatei - insbesondern ausgelegt auf 4-spaltige Datensätze.
So kannst Du den Code selbst vielleicht zunächst etwas leichter nachvollziehen.
Code gehört in ein allgemeines Modul.

Option Explicit
Sub til()
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim Ws3 As Worksheet
Dim C   As Range
Dim l   As Long
Set Ws1 = Worksheets("Tabelle1") 'Erste Liste
Set Ws2 = Worksheets("Tabelle2") 'Zweite Liste
Set Ws3 = Worksheets("Tabelle3") 'Ausgabeblatt der nicht doppelten
l = 4 'Startzeile in Zieltabelle
'Einträge aus Blatt 1 in Blatt 2 überprüfen
For Each C In Ws1.Range("A:A").SpecialCells(xlCellTypeConstants)
If WorksheetFunction.CountIf(Ws2.Range("A:A"), C) = 0 Then
With Ws3
.Cells(l, 2) = C
.Cells(l, 3) = C.Offset(0, 1)
.Cells(l, 4) = C.Offset(0, 2)
.Cells(l, 5) = C.Offset(0, 3)
End With
l = l + 1
End If
Next C
'Einträge aus Blatt 2 in Blatt 1 überprüfen
For Each C In Ws2.Range("A:A").SpecialCells(xlCellTypeConstants)
If WorksheetFunction.CountIf(Ws1.Range("A:A"), C) = 0 Then
With Ws3
.Cells(l, 2) = C
.Cells(l, 3) = C.Offset(0, 1)
.Cells(l, 4) = C.Offset(0, 2)
.Cells(l, 5) = C.Offset(0, 3)
End With
l = l + 1
End If
Next C
End Sub
VG, Boris
Anzeige
AW: Ich denke, der Code läuft (lief)...
14.08.2018 09:50:46
Lara
Hallo Boris,
wow, vielen Dank! Dein Code läuft perfekt und ich kann ein paar Dinge nachvollziehen. Was müsste ich ändern wenn ich in der Zieltabelle zwischen den beiden Abgleichen eine Leerzeile haben möchte? Also in Tabelle 3 "Daten, die in Tabelle 2 fehlen" Leerzeile "Daten, die in Tabelle 1 fehlen".
Wo die Startzeile jetzt im Code steht und wie ich sie ändern kann verstehe ich jetzt auch. Wo könnte ich die Startspalte für die Zieltabelle ändern?
Vielen Dank für deine schnellen Antworten und für deine Zeit
Lara
AW: Ich denke, der Code läuft (lief)...
14.08.2018 12:04:24
{Boris}
Hi,
hab jetzt noch die Variable k für die Spalte eingebaut sowie eine Leerzeile zwischen beiden Abgleichen erzeugt (dafür muss man nur den Zeilenzähler l vor der 2. Prüfroutine um 1 erhöhen):
Option Explicit
Sub til()
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim Ws3 As Worksheet
Dim C   As Range
Dim l   As Long
Dim k   As Long
Set Ws1 = Worksheets("Tabelle1") 'Erste Liste
Set Ws2 = Worksheets("Tabelle2") 'Zweite Liste
Set Ws3 = Worksheets("Tabelle3") 'Ausgabeblatt der nicht doppelten
l = 4 'Startzeile in Zieltabelle
k = 2 'Startspalte in Zieltabelle
'Einträge aus Blatt 1 in Blatt 2 überprüfen
For Each C In Ws1.Range("A:A").SpecialCells(xlCellTypeConstants)
If WorksheetFunction.CountIf(Ws2.Range("A:A"), C) = 0 Then
With Ws3
.Cells(l, k) = C
.Cells(l, k + 1) = C.Offset(0, 1)
.Cells(l, k + 2) = C.Offset(0, 2)
.Cells(l, k + 3) = C.Offset(0, 3)
End With
l = l + 1
End If
Next C
l = l + 1 'Eine Leerzeile lassen zwischen beiden Prüfungen
'Einträge aus Blatt 2 in Blatt 1 überprüfen
For Each C In Ws2.Range("A:A").SpecialCells(xlCellTypeConstants)
If WorksheetFunction.CountIf(Ws1.Range("A:A"), C) = 0 Then
With Ws3
.Cells(l, k) = C
.Cells(l, k + 1) = C.Offset(0, 1)
.Cells(l, k + 2) = C.Offset(0, 2)
.Cells(l, k + 3) = C.Offset(0, 3)
End With
l = l + 1
End If
Next C
End Sub
VG, Boris
Anzeige
AW: Ich denke, der Code läuft (lief)...
14.08.2018 14:35:01
Lara
Hallo Boris,
danke, jetzt funktioniert alles super!
liebe Grüße Lara
AW: Ich denke, der Code läuft (lief)...
15.08.2018 13:50:05
{Boris}
Noch etwas flexibler ist es, wenn Du die Anzahl der Datenspalten (in Deinem Beispiel ja 4) variabel gestalten kannst.
Somit hier noch abschließend der entsprechende Code:

Option Explicit
Sub til()
'Variablendeklarationen
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim Ws3 As Worksheet
Dim C   As Range
Dim l   As Long         'Startzeile und Zeilenzähler
Dim k   As Long         'Startspalte
Dim x   As Long         'Zählvariable
Dim y   As Long         'Spaltenanzahl der Datensätze
'Die einzelnen Blätter den Objektvariablen zuweisen
Set Ws1 = Worksheets("Tabelle1") 'Erste Liste
Set Ws2 = Worksheets("Tabelle2") 'Zweite Liste
Set Ws3 = Worksheets("Tabelle3") 'Ausgabeblatt der nicht doppelten
'Diese Parameter bei Bedarf anpassen!
l = 4 'Startzeile in Zieltabelle
k = 2 'Startspalte in Zieltabelle
y = 4 'Spaltenanzahl der Datensätze
'Einträge aus Blatt 1 in Blatt 2 überprüfen
For Each C In Ws1.Range("A:A").SpecialCells(xlCellTypeConstants)
'Wenn Datensatz nicht vorhanden...
If WorksheetFunction.CountIf(Ws2.Range("A:A"), C) = 0 Then
'dann Datensatz im Ausgabeblatt auflisten
With Ws3
For x = 0 To y
.Cells(l, k + x) = C.Offset(0, x)
Next x
End With
'Zeilenzähler für nächsten Datensatz um 1 erhöhen
l = l + 1
End If
Next C
l = l + 1 'Eine Leerzeile lassen zwischen beiden Prüfungen
'Einträge aus Blatt 2 in Blatt 1 überprüfen
For Each C In Ws2.Range("A:A").SpecialCells(xlCellTypeConstants)
'Wenn Datensatz nicht vorhanden...
If WorksheetFunction.CountIf(Ws1.Range("A:A"), C) = 0 Then
'dann Datensatz im Ausgabeblatt auflisten
With Ws3
For x = 0 To y
.Cells(l, k + x) = C.Offset(0, x)
Next x
End With
'Zeilenzähler für nächsten Datensatz um 1 erhöhen
l = l + 1
End If
Next C
End Sub
VG, Boris
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige