Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Per VBA intelligente Tabellen vergleichen und erweitern

Per VBA intelligente Tabellen vergleichen und erweitern
03.07.2024 16:23:52
lambert
Hallo zusammen, ich habe zwei intelligente Tabellen welche ich gerne miteinander vergleichen möchte. Als Vergleichswert habe ich eine ID, welche immer identisch bleib. Meine Masterliste wird immer wieder aktualisiert und bekommt stetig neue Zeilen und damit neue IDs dazu. Die Arbeitsliste soll nun mit der Masterliste abgeglichen werden und um die neuen IDs erweitert werden.

Mein erster Test, als Trockenübung war folgender Code:


Sub Daten_abgleichen()
For Each cl In Range("A:A")
Set gef = Range("F:F").Find(cl, , , xlWhole)
If gef Is Nothing Then Range("F2").End(xlDown).Offset(1, 0) = cl
Next cl
End Sub

Das funktioniert super.

Nun möchte ich aber nicht die ganzen Spalten angeben, sondern da ich zwei intelligente Tabellen verwende, diese auch direkt ansprechen. Hier mein Ansatz:


Sub Daten_abgleichen()

'Import Tabelle als Variable speichern
Dim tbl_master As ListObject
Set tbl_master = Sheets("Masterliste").ListObjects(1)

'Zu erweiternde Tabelle als Variable speichern
Dim tbl_work As ListObject
Set tbl_work = Sheets("Arbeitsliste").ListObjects(1)

For Each cl In tbl_master.ListColumns(2).DataBodyRange
Set gef = tbl_work.ListColumns(2).DataBodyRange.Find(cl, , , xlWhole)
If gef Is Nothing Then tbl_work.ListColumns(2).DataBodyRange.End(xlDown).Offset(1, 0) = cl
Next cl

End Sub


Leider klappt dieser Ansatz noch nicht und ich vermute, dass man das besser lösen kann. Leider finde ich gerade keinen Ansatz. Ich freue mich auf eure Unterstützung. Hier meine Testdatei: https://www.herber.de/bbs/user/170660.xlsm

Grüße
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
03.07.2024 17:22:03
GerdL
Moin

Sub Daten_abgleichen_Test_3()


'Import Tabelle als Variable speichern
Dim tbl_master As ListObject
Set tbl_master = Sheets("Masterliste").ListObjects(1)


'Zu erweiternde Tabelle als Variable speichern
Dim tbl_work As ListObject
Set tbl_work = Sheets("Arbeitsliste").ListObjects(1)


For Each cl In tbl_master.ListColumns(2).DataBodyRange
Set gef = tbl_work.ListColumns(2).DataBodyRange.Find(cl, , xlValues, xlWhole)
If gef Is Nothing Then
If IsEmpty(tbl_work.Range.Cells(2, 2)) Then
tbl_work.Range.Cells(2, 2) = cl
Else
tbl_work.Range.Cells(1, 2).End(xlDown).Offset(1, 0) = cl
End If
End If
Next cl


MsgBox "Datenabgleich", vbOKOnly, "Alle neuen IDs wurden in die Arbeitsliste übertragen."
End Sub


Du kannst u.a. bei der Messagebox noch differenzieren, ob ein neuer Wert vorliegt.
Gruß Gerd

Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
03.07.2024 18:26:03
Luschi
Hallo Gerd,

in meiner Excel-365-Version wird das Listobject NICHT automatisch nach unten erweitert, wenn ich manuell oder per Vba 1 Zeile tiefer einen Wert eingebe.
Deshalb werden mit Deinem Vba-Code die neuen Daten immer nur in Arbeitsliste!B6:D6 geschrieben; in der Version von Karin wird dieser Umstand berücksichtigt und die Listobject-Erweiterung per Vba realisiert.

Gruß von Luschi
aus klein-Paris
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
04.07.2024 09:28:40
GerdL
Danke für die Info, Luschi. In meiner Steinzeitversion erweitert Excel die Tabellchen halt noch automatisch.
Gruß Gerd
AW: Per VBA intelligente Tabellen vergleichen und erweitern
03.07.2024 17:23:59
Beverly
Hi,

Sub Daten_abgleichen_Test2()

'Import Tabelle als Variable speichern
Dim tbl_master As ListObject
Set tbl_master = Sheets("Masterliste").ListObjects(1)
'Zu erweiternde Tabelle als Variable speichern
Dim tbl_work As ListObject
Set tbl_work = Sheets("Arbeitsliste").ListObjects(1)
For Each cl In tbl_master.DataBodyRange.Columns(2).Cells
Set gef = tbl_work.DataBodyRange.Columns(2).Find(cl, , , xlWhole)
If gef Is Nothing Then
With tbl_work
.ListRows.Add alwaysinsert:=True
.DataBodyRange.Cells(.ListRows.Count, 2) = cl
.DataBodyRange.Cells(.ListRows.Count, 1) = cl.Offset(0, -1)
.DataBodyRange.Cells(.ListRows.Count, 3) = cl.Offset(0, 1)
End With
End If
Next cl
MsgBox "Datenabgleich", vbOKOnly, "Alle neuen IDs wurden in die Arbeitsliste übertragen."
End Sub


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
04.07.2024 09:13:28
lambert
Hallo und vielen Dank für die schnellen Rückmeldungen. Karins Lösung funktioniert und Gerds Vorschlag mit dem Counter finde ich super, das habe ich mal ergänzt.

Kann man Spalten von intelligenten Tabellen auch per VBA über ihren Spaltennamen ansprechen oder geht das nur über .Offset(0, #) ?

Jetzt habe ich meine Arbeitsliste noch um ein Feld "Zuständig" erweitert, welches manuell immer wieder geändert wird. Nun möchte ich die vorhandenen Daten in der Arbeitsliste mit der Masterliste abgleichen und z.B. den Status, wenn er sich in der Masterliste geändert hat, in die Arbeitsliste übertragen.

https://www.herber.de/bbs/user/170682.xlsm


Vielen Dank an Euch
Philipp
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
04.07.2024 10:21:15
Beverly
Hi Phillip,

du kannst in einer Schleife die Spaltennummer ermitteln und diese Spaltennummer dann entsprechend weiter verwenden:

    ' Spaltennummer ermitteln für Spalte "Status" in Mastertabelle

Dim intStatus1 As Integer
For intStatus1 = 1 To tbl_master.ListColumns.Count
If tbl_master.ListColumns(intStatus1).Name = "Status" Then Exit For
Next intStatus1
' Spaltennummer ermitteln für Spalte "Status" in Mastertabelle
Dim intStatus2 As Integer
For intStatus2 = 1 To tbl_work.ListColumns.Count
If tbl_work.ListColumns(intStatus2).Name = "Status" Then Exit For
Next intStatus2


Wenn du nun in einer Schleife über alle Zeilen deiner Tabellen läufst kannst du beide Spalten vergleichen und prüfen ob ihre Einträge identisch sind oder nicht:

Sub StatusAgleichen()

' Masterliste Tabelle als Variable speichern
Dim tbl_master As ListObject
Set tbl_master = Sheets("Masterliste").ListObjects(1)

' Zu erweiternde Tabelle als Variable speichern
Dim tbl_work As ListObject
Set tbl_work = Sheets("Arbeitsliste").ListObjects(1)

' Spaltennummer ermitteln für Spalte "Status" in Mastertabelle
Dim intStatus1 As Integer
For intStatus1 = 1 To tbl_master.ListColumns.Count
If tbl_master.ListColumns(intStatus1).Name = "Status" Then Exit For
Next intStatus1
' Spaltennummer ermitteln für Spalte "Status" in Arbeitstabelle
Dim intStatus2 As Integer
For intStatus2 = 1 To tbl_work.ListColumns.Count
If tbl_work.ListColumns(intStatus2).Name = "Status" Then Exit For
Next intStatus2

' Spalteninhalte abgleichen
Dim lngZeile As Long
With tbl_work
For lngZeile = 1 To .DataBodyRange.Rows.Count
If tbl_work.DataBodyRange.Columns(intStatus2).Cells(lngZeile).Value > _
tbl_master.DataBodyRange.Columns(intStatus1).Cells(lngZeile).Value Then
.DataBodyRange.Columns(intStatus2).Cells(lngZeile) = tbl_master.DataBodyRange.Columns(intStatus1).Cells(lngZeile)
End If
Next lngZeile
End With
End Sub


Bedingung ist dabei natürlich, dass die Reihenfolge in beiden Tabellen dieselbe ist und auch die Anzahl an Einträgen.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/

Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
04.07.2024 15:32:11
lambert
Hallo Karin und Danke für deinen Ansatz, ich habe es jetzt auf einen anderen Weg gelöst:
Sub Vorhandene_Ids_aktualisieren()


' Masterliste Tabelle als Variable speichern
Dim tbl_master As ListObject
Set tbl_master = Sheets("Masterliste").ListObjects(1)

' Zu erweiternde Tabelle als Variable speichern
Dim tbl_work As ListObject
Set tbl_work = Sheets("Arbeitsliste").ListObjects(1)

' Z�hlen wie viele IDs hinzugekommen sind
Dim neu As Integer
neu = 0

For Each ID In tbl_master.DataBodyRange.Columns(2).Cells
Set work_ID = tbl_work.DataBodyRange.Columns(2).Find(ID, , , xlWhole)
If Not work_ID Is Nothing Then

' Z�hlen
neu = neu + 1

With tbl_work

' Status aktualisieren
.DataBodyRange.Cells(work_ID, 5) = ID.Offset(0, 2)

End With

End If
Next ID

MsgBox "Es wurden " & neu & " Datens�tze in der Arbeitsliste aktualisiert.", vbOKOnly, "Datenabgleich"

End Sub


Wollte eigentlich noch prüfen, ob sich der Status verändert hat aber das hat er so nicht genommen:


IF tbl_work.DataBodyRange.Cells(work_ID, 5) > ID Then
' STatus ändern
End If


Jedoch habe ich später 10.000, 12.000 oder 15.000 Datenzeilen. Testweise habe ich mal knapp 1.000 geladen, was schon sehr lange gedauert hat.


https://www.herber.de/bbs/user/170702.xlsm
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
04.07.2024 17:21:48
Beverly
Hi,

hattest du nicht geschrieben, dass du mit Offset nicht arbeiten willst...?

Deine Variable work_ID ist eine Range-Variable, die zufälligerweise einen Zahlenwert als Zellinhalt hat, da du ja die ID vergleichst - deshalb werden bei dir die falschen Zeilen aktualisiert, und zwar die Zeilen, deren Wert in der Zelle steht und nicht die Zeilen, in der work_ID gefunden wurde.
Auch deine Zählvariable n gibt ein falsches Ergebnis aus, denn du zählst sie hoch, sobald work_ID gefunden wurde - das bedeutet aber noch lange nicht, dass auch der Status aktualisiert werden muss, d.h. sie darf erst dann hochgezählt werden, wenn geprüft wurde, ob eine Aktualisierung überhaupt erforderlich ist.

So sollte ein Schuh daraus werden:

    For Each ID In tbl_master.DataBodyRange.Columns(2).Cells

Set work_ID = tbl_work.DataBodyRange.Columns(2).Find(ID, , , xlWhole)
If Not work_ID Is Nothing Then
With tbl_work
' Status aktualisieren
If work_ID.Offset(0, 3) > ID.Offset(0, 2) Then
' Zählen
neu = neu + 1
work_ID.Offset(0, 3) = ID.Offset(0, 2)
End If
End With
End If
Next ID


Bis später
Karin

Link zur Homepage: https://excel-inn.de/
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
05.07.2024 12:20:59
lambert
Hallo Karin, vielen herzlichen Dank! Das ist mir leider nicht aufgefallen.

Bzgl. dem Offset wollte ich wissen, ob man die Spalten auch über ihren Namen ansprechen kann. Ob der Weg über .Offset oder .Name für meine Zwecke besser ist weiß ich noch nicht. Hast du einen Tipp für mich, ob das Eine oder Andere bei den Datenmengen (größer 10.000 Zeilen) besser performt?

Damit ich auch sehe, dass etwas in der Datei passiert, habe ich noch einen Ladebalken eingebaut. ( Hier hat mir dieses Video weitergeholfen https://www.youtube.com/watch?v=NiY55LumH38 )
https://www.herber.de/bbs/user/170720.xlsm

Liebe Grüße
Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
05.07.2024 12:52:16
Beverly
Hi,

wie du die Spaltennummer mit der betreffenden Überschrift ("Status") in beiden Tabellen ermitteln und dann entsprechend weiterverwenden kannst hatte ich bereits in meinem vorhergehenden Code ausgeführt.

Ob du mit Offset oder der Spaltennummer arbeitest ist letztendlich irrelevant. Die Spaltennummer hilft dir aber, wenn dir nicht bekannt ist, in welcher Spalte sich diese Überschrift befindet. Du musst bei Offset(Zeile, Spaltenversatz) doch festlegen, um wieviele Spalten versetzt sich die gesuchte Spalte befindet, also kannst du auch gleich mit der Spaltennummer arbeiten.

Tipp am Rande: da bei deinen vielen Zeilen der Code sowieso schon eine gewisse Zeit braucht, würde ich nicht noch zusätzlich einen Ladebalken einbauen - der bremst die Performance nur aus.

Bis später
Karin

Link zur Homepage: https://excel-inn.de/



Anzeige
AW: Per VBA intelligente Tabellen vergleichen und erweitern
08.07.2024 09:19:42
lambert
Guten Morgen und besten Dank. Dann lasse ich den Fortschrittsbalken lieber weg und lasse das Makro in Ruhe laufen. Funktioniert super.

Vielen Dank! :)
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige