Hallo Klaus,
du kannst ja den Code im Einzelschritt (F8) durchgehen und schauen was er im Tabellenblatt bewirkt.
Den Code
Option Explicit
Sub Bsp()
Dim rngT1 As Excel.Range
Dim rngT1H As Excel.Range
Dim rngT2 As Excel.Range
Dim rngT2H As Excel.Range
Dim rngCell As Excel.Range
Dim rngResult As Excel.Range
Dim strAddr As String
Set rngT1 = Worksheets("Tabelle1").UsedRange
Set rngT2 = Worksheets("Tabelle2").UsedRange
'eine (Hilfs-)Spalte einfügen (Tabellenbereich wird nach rechts verschoben)
Call rngT1.Columns(1).Insert(xlShiftToRight)
'eine (Hilfs-)Spalte einfügen (Tabellenbereich wird nach rechts verschoben)
Call rngT2.Columns(1).Insert(xlShiftToRight)
'die (Hilfs-)Spalte referenziern
Set rngT1H = rngT1.Columns(1).Offset(, -1)
Set rngT2H = rngT2.Columns(1).Offset(, -1)
'die zwei Spalten rechst von der Hilfsspalte miteinander verketten
rngT1H.FormulaR1C1 = "=CONCATENATE(""'"",RC[1],""'"",""-"",""'"",RC[2],""'"")"
rngT2H.FormulaR1C1 = "=CONCATENATE(""'"",RC[1],""'"",""-"",""'"",RC[2],""'"")"
'jede Zeile in Tabelle2 abarbeiten
For Each rngCell In rngT2H.Cells
'Wert aus (Hilfs-)Spalte Tabelle2 in (Hilfs-)Spalte Tabelle1 suchen
Set rngResult = rngT1H.Find(rngCell.Value, , LookIn:=xlValues, LookAt:=xlWhole)
If Not rngResult Is Nothing Then
strAddr = rngResult.Address 'Zelladdr. des 1. Treffers merken
Do
'ggf. neue Zeile einfügen
If Not IsEmpty(rngT2.Cells(rngCell.Row, 3).Value) Then
Call rngT2.Rows(rngCell.Row).EntireRow.Offset(1).Insert(xlShiftDown)
'Wert übernehmen
rngT2.Cells(rngCell.Row + 1, 3).Value = rngResult.Offset(, 3).Value
Else
'Wert übernehmen
rngT2.Cells(rngCell.Row, 3).Value = rngResult.Offset(, 3).Value
End If
'nach weiteren Treffern in Tabelle1 suchen
Set rngResult = rngT1H.FindNext(After:=rngResult)
Loop While rngResult.Address <> strAddr 'solange bis keine >neue< Zelle mehr gefunden wird
End If
Next
'(Hilfs-)Spalten löschen
Call rngT1H.Delete(xlShiftToLeft)
Call rngT2H.Delete(xlShiftToLeft)
End Sub
nochmal schnell überflogen, müssten sich die entspr. markierten Zeilen ändern.
|