Vergleichen je 2 Spalten in 2 Tabellen

Hi!

Ich habe ein MAkro geschriben, das genau das macht was ich NICHT will- s. unten.

Was ich will: Vergleiche Spalte B in Tabelle 1 mit Spalte B in TAbelle 2.Wenn identisch vergleiche Spalte D in TAb. 1 mit Spalte D in Tab. 2. Wenn diese Werte ungleich sind, kopiere die Zeile in Tabelle3.

Was das Makro macht ist die Zeilen mit gleichen Werten in Spalte D zu kopieren.

Makro: Sub Spaltenvergleich()

Dim LoI As Long ’ 1. Schleifenvariable
Dim LoJ As Long ’ 2. Schleifenvariable
Dim LoLetzte1 As Long ’ Variable letzte Zeile in Tabelle1
Dim LoLetzte2 As Long ’ Variable letzte Zeile in Tabelle2
Dim Loletzte3 As Long ’ Variable letzte Zeile in Tabelle3
Application.ScreenUpdating = False ’ Bildschirmaktualisierung aus
With Worksheets(„Tabelle1“) ’ letzte Zeile in Spalte B Tabelle1
LoLetzte1 = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(Rows.Count, 2).End(xlUp).Row, .Rows.Count)
End With
With Worksheets(„Tabelle2“) ’ letzte Zeile in Spalte B Tabelle2
LoLetzte2 = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(Rows.Count, 2).End(xlUp).Row, .Rows.Count)
End With
With Worksheets(„Tabelle1“) ’ letzte Zeile in Spalte B Tabelle1
LoLetzte1 = IIf(IsEmpty(.Cells(Rows.Count, 4)), .Cells(Rows.Count, 4).End(xlUp).Row, .Rows.Count)
End With
With Worksheets(„Tabelle2“) ’ letzte Zeile in Spalte B Tabelle2
LoLetzte2 = IIf(IsEmpty(.Cells(Rows.Count, 4)), .Cells(Rows.Count, 4).End(xlUp).Row, .Rows.Count)
End With
For LoI = 1 To LoLetzte1 ’ 1. Schleife alle Werte Spalte B
For LoJ = 1 To LoLetzte2 ’ 2. Schleife alle Werte Spalte B
If Worksheets(„Tabelle1“).Cells(LoI, 2) „“ Then ’ Leerzellen nicht kennzeichnen
If Worksheets(„Tabelle1“).Cells(LoI, 2) = Worksheets(„Tabelle2“).Cells(LoJ, 2) Then
If Worksheets(„Tabelle1“).Cells(LoI, 4) Worksheets(„Tabelle2“).Cells(LoJ, 4) Then
End If
Worksheets(„Tabelle1“).Rows(LoI).Copy ’ Zellen sind gleich, Zeile Kopieren
With Worksheets(„Tabelle3“)
’ letzte belegte Zeile in Tabelle3 ermitteln
Loletzte3 = .UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
If Loletzte3 > Rows.Count Then ’ ermittelte Zeilennummer mit max. Anzahl vergleichen
MsgBox „In Tabelle3 ist keine Zeile mehr frei“
Application.CutCopyMode = False ’ Zwischenspeicher löschen
Exit Sub
End If
.Rows(Loletzte3).PasteSpecial Paste:=xlValues ’ Werte übertragen
.Rows(Loletzte3).PasteSpecial Paste:=xlFormats ’ Formate übertragen
End With
Exit For ’ innere Schleife verlassen da Datensatz gefunden
End If
End If
Next LoJ
Next LoI
Application.CutCopyMode = False ’ Zwischenspeicher löschen
Application.ScreenUpdating = True ’ Bildschirmaktualisierung ein
End Sub

Was muss ich daran ändern, damit es so läuft wie ich es haben möchte?
Wie ist der Ausdruck für „und wenn“ sowie für „ungleich“?

Vielen Dank.

Grüße

Hallo Tweety,

Was das Makro macht ist die Zeilen mit gleichen Werten in
Spalte D zu kopieren.

warum auch nicht, du hast es ja so programmiert.
Hier:

If Worksheets(„Tabelle1“).Cells(LoI, 4) Worksheets(„Tabelle2“).Cells(LoJ, 4) Then
End If

In diese If…End If gehört noch Code.

Gruß
Reinhard

Hi,

nun verstehe ich endgültig gar nichts; ich verstehe auch nicht sehr viel von Programmieren - habe eine halbe Ewigkeit gebraucht um mir das alles zusammen zu stückeln.

Was heißt das : da gehört noch Code rein?

Stimmen die zwei Zeilen wenigstens soweit:
If Worksheets(„Tabelle1“).Cells(LoI, 2) = Worksheets(„Tabelle2“).Cells(LoJ, 2) Then
If Worksheets(„Tabelle1“).Cells(LoI, 4) Worksheets(„Tabelle2“).Cells(LoJ, 4) Then

Was muss da noch rein?

Danke dir.

Moin auch,

Was heißt das : da gehört noch Code rein?

Na, dass da noch Code rein gehört :smile:
Du schrubst:

If Worksheets("Tabelle1").Cells(LoI, 2) "" Then ' Leerzellen nicht kennzeichnen
If Worksheets("Tabelle1").Cells(LoI, 2) = Worksheets("Tabelle2").Cells(LoJ, 2) Then
If Worksheets("Tabelle1").Cells(LoI, 4) Worksheets("Tabelle2").Cells(LoJ, 4) Then
End If

Unten angefangen: Wenn die vierten Spalten nicht identisch sind dann…
Aber was dann? Das schreibst du nämlich nicht, sondern beendet die If-Schleife einfach ohne weitere Anweisungen.

Was muss da noch rein?

Code.

Danke dir.

Gerne.

Ralph

hallo Tweety,

nun verstehe ich endgültig gar nichts; ich verstehe auch nicht
sehr viel von Programmieren - habe eine halbe Ewigkeit
gebraucht um mir das alles zusammen zu stückeln.

verstehe ich gut, in Excel geht das zwar inzwischen rel. fix bei mir, vieles kann ich schon einfach so runterschreiben, aber wenn ich mich in Word-Vba oder Outlook-Vba versuche gehts mir wie dir jetzt oder mir früher in Excel-Vba.
Und die langen Zeiten die dabei draufgehen kenne ich.

Was heißt das : da gehört noch Code rein?

Du hast da quasi stehen

If Tab1!Bx = Tab2!Bx Then
 If Tab1!Dx Tab2!Dx Then
 End if
 'weiterer Code
End if

D.h. „weiterer Code“ wird immer ausgeführt wenn Tab1!Bx = Tab2!Bx ist.
Tab1!Dx und Tab2!Dx spielen keine Rolle dabei.
Du mußt deinen Code so umbauen vom Prinzip her:

If Tab1!Bx = Tab2!Bx Then
 If Tab1!Dx Tab2!Dx Then
 'weiterer Code
 End if
End if

Stimmen die zwei Zeilen wenigstens soweit:
If Worksheets(„Tabelle1“).Cells(LoI, 2) =
Worksheets(„Tabelle2“).Cells(LoJ, 2) Then
If Worksheets(„Tabelle1“).Cells(LoI, 4)
Worksheets(„Tabelle2“).Cells(LoJ, 4) Then

ja, sind okay, korrekter ist:
Worksheets(„Tabelle1“).Cells(LoI, 2).Value

und ich lasse das „.Value“ auch oft weg. Und mal sowas weglassen klappt halt in 99% der Fälle aber nicht in 100%.
Sichere Seite ist das halt hinzuschreiben.

Bei richtig großen Projekten mit zig Modulen und Prozeduren muß man es hinschreiben um im Vorfeld alle möglichen bekannten Fehlerquellen gleich zu unterbinden zu versuchen.
Man hat genug zu tun um da Fehler bei unbekannten Fehlern zu lokalisieren/behebn.

Gruß
Reinhard

Das da eine Anweisung rein gehört, habe ich inzwischen begriffen :smile:. Das Problem ist, wie geht der Code für „Kopiere Zeile, aber nur wenn Spalten B zwar identisch, aber nicht Spalten D“?

Was ich habe ist, das er mir Zeile, die gleichen spalten B und D als inhalt haben, kopiert.

GRuß

Das da eine Anweisung rein gehört, habe ich inzwischen
begriffen :smile:. Das Problem ist, wie geht der Code für „Kopiere
Zeile, aber nur wenn Spalten B zwar identisch, aber nicht
Spalten D“?

Hallo Tweety,

Option Explicit
'
Sub Spaltenvergleich()
Dim wks1 As Worksheet, wks2 As Worksheet
Dim LoI As Long ' 1. Schleifenvariable
Dim LoJ As Long ' 2. Schleifenvariable
Dim LoLetzte1 As Long ' Variable letzte Zeile in Tabelle1
Dim LoLetzte2 As Long ' Variable letzte Zeile in Tabelle2
Dim Loletzte3 As Long ' Variable letzte Zeile in Tabelle3
Application.ScreenUpdating = False ' Bildschirmaktualisierung aus
Set wks1 = Worksheets("Tabelle1")
Set wks2 = Worksheets("Tabelle2")
LoLetzte1 = wks1.Cells(Rows.Count, 2).End(xlUp).Row
LoLetzte2 = wks2.Cells(Rows.Count, 2).End(xlUp).Row
With Worksheets("Tabelle3")
 For LoI = 1 To LoLetzte1 ' 1. Schleife alle Werte Spalte B
 For LoJ = 1 To LoLetzte2 ' 2. Schleife alle Werte Spalte B
 ' Leerzellen nicht kennzeichnen
 If wks1.Cells(LoI, 2) "" And wks2.Cells(LoJ, 2) "" Then
 If wks1.Cells(LoI, 2) = wks2.Cells(LoJ, 2) Then
 If wks1.Cells(LoI, 4) wks2.Cells(LoJ, 4) Then
 ' letzte belegte Zeile in Tabelle3 ermitteln
 Loletzte3 = .UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
 If Loletzte3 \> Rows.Count Then ' ermittelte Zeilennummer mit max. Anzahl vergleichen
 MsgBox "In Tabelle3 ist keine Zeile mehr frei"
 Application.CutCopyMode = False ' Zwischenspeicher löschen
 Exit Sub
 End If
 wks1.Rows(LoI).Copy Destination:=.Cells(Loletzte3, 1)
 Exit For ' innere Schleife verlassen da Datensatz gefunden
 End If
 End If
 End If
 Next LoJ
 Next LoI
End With
Application.CutCopyMode = False ' Zwischenspeicher löschen
Application.ScreenUpdating = True ' Bildschirmaktualisierung ein
End Sub

Gruß
Reinhard

Hi,

es klappt. Vielen, vielen Dank.

Grüße