Ansich nicht ganz so schwer. Nur das du exakt dazu wa im Netz findest, ist ziemlich unwahrscheinlich. Da muss man schon selber "kreativ" genug sein. Nur darum gehts beim Programmieren. ;)
Teste mal ob das wie gewünscht funktioniert - ich würde denken, ja:
(Der Quelltext muss im Klassenmodul der Zieltabelle (z.B. Tabelle3) drinnen stehen)
Option Explicit
Sub Tabelle3_Test()
Application.ScreenUpdating = False
On Error GoTo ErrHandler
'Tabelle3 komplett von Daten befreien
Call UsedRange.Delete
Dim rngT1Body As Excel.Range
Dim rngT2Body As Excel.Range
'Quell-Bereiche referenzieren
Set rngT1Body = Tabelle1.UsedRange
Set rngT2Body = Tabelle2.UsedRange
'Bereiche nebeneinander in Tabelle3 kopieren
Call rngT1Body.Copy(Range("A1"))
Call rngT2Body.Copy(Range("A1").Offset(, rngT1Body.Columns.Count))
'nun beide Bereiche in Tabelle3 referenzieren
Set rngT1Body = Range("A1").Resize(rngT1Body.Rows.Count, rngT1Body.Columns.Count)
Set rngT2Body = Range("A1").Offset(, rngT1Body.Columns.Count).Resize(rngT2Body.Rows.Count, rngT2Body.Columns.Count)
'beide Tabellenbereiche nun nach der TestID (aufsteigend) sortieren
'Annahme: Tabelle1.TestID in 2. Spalte
' Tabelle2.TestID in 1. Spalte
Call rngT1Body.Sort(rngT1Body.Cells(1, 2), xlAscending, Header:=xlYes)
Call rngT2Body.Sort(rngT2Body.Cells(1, 1), xlAscending, Header:=xlYes)
'und nun die jeweiligen Start-Bereiche
'für weitere Verarbeitung in Tabelle3 referenzieren
Set rngT1Body = rngT1Body.Rows(2) 'Zeile2 (Zeile1 stehen ja die Überschriften)
Set rngT2Body = rngT2Body.Rows(2) 'Zeile2 (Zeile1 stehen ja die Überschriften)
'Los gehts!
'(solange bis entweder Tabelle1.TestID, oder Tabelle2.TestID leer ist)
Do While rngT1Body.Cells(1, 2).Value <> "" Or rngT2Body.Cells(1, 1).Value <> ""
If rngT2Body.Cells(1, 1).Value = rngT2Body.Cells(rngT2Body.Rows.Count + 1, 1).Value Then
'Tabelle2.TestID mit Tabelle1.TestID matchen
Set rngT2Body = rngT2Body.Resize(rngT2Body.Rows.Count + 1)
ElseIf rngT1Body.Cells(1, 2).Value = rngT2Body.Cells(1, 1).Value Then
'wenn Tabelle1.TestID = Tabelle2.TestID ist, dann wird
'entspr. der Zeilen von Tabelle2 in Tabelle1 Platz geschaffen
Call rngT1Body.Offset(1).Resize(rngT2Body.Rows.Count - 1).Insert(xlShiftDown)
'Werte runterkopieren
Call rngT1Body.Copy(rngT1Body.Offset(1).Resize(rngT2Body.Rows.Count - 1))
'wenn in Tabelle1 eine TestID mehrfach vorkommt, ...
If rngT1Body.Row = rngT2Body.Row + rngT2Body.Rows.Count Then
'... dann wird in Tabelle2 dafür Platz geschaffen ...
Call rngT2Body.Offset(rngT2Body.Rows.Count).Insert(xlShiftDown)
'... und die Werte runterkopieren
Call rngT2Body.Copy(rngT2Body.Offset(rngT2Body.Rows.Count))
End If
'nächste Zeile in Tabelle1
Set rngT1Body = rngT1Body.Offset(rngT2Body.Rows.Count)
Else
'nächste Tabelle2.TestID
Set rngT2Body = rngT1Body.Offset(, 2)
'wenn Tabelle2.TestID ungleich Tabelle1.TestID ist, ...
If rngT2Body.Cells(1, 1).Value <> rngT1Body.Cells(1, 2).Value Then
'... dann wird diese Zeile in Tabelle2 entfernt
Call rngT2Body.Delete(xlShiftUp)
Set rngT2Body = rngT1Body.Offset(, 2) 'Zeile in Tabelle2 neu referenzieren
End If
End If
Loop
'da nun Tabelle1.TestID = Tabelle2.TestID ist
'kann eine davon gelöscht werden
Call rngT1Body.Cells(1, 2).EntireColumn.Delete(xlShiftToLeft)
'Endtabelle sortieren nach SetID und TestID
'Annahme: SetID in 1. Spalte
' TestID in 2. Spalte
' With UsedRange
' Call .Sort(Key1:=.Cells(1, 1), Order1:=xlAscending, _
' Key2:=.Cells(1, 2), Order2:=xlAscending, _
' Header:=xlYes)
' End With
GoTo SafeExit
ErrHandler:
Call MsgBox(Err.Description, vbCritical, "Fehler " & Err.Number)
' Resume
SafeExit:
Application.ScreenUpdating = True
End Sub
|