Thema Datum  Von Nutzer Rating
Antwort
08.04.2015 11:38:34 Nele
NotSolved
Blau Tabellen zusammenführen
08.04.2015 18:52:31 Gast97058
NotSolved
08.04.2015 18:56:46 Gast47474
NotSolved

Ansicht des Beitrags:
Von:
Gast97058
Datum:
08.04.2015 18:52:31
Views:
873
Rating: Antwort:
  Ja
Thema:
Tabellen zusammenführen

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

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
08.04.2015 11:38:34 Nele
NotSolved
Blau Tabellen zusammenführen
08.04.2015 18:52:31 Gast97058
NotSolved
08.04.2015 18:56:46 Gast47474
NotSolved