Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1504to1508
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
2 Listen vergleichen
18.07.2016 11:44:41
Dauth
Hallo alle zusammen!
Ich muss für meine Arbeit 2 Listen miteinander vergleichen.
Dafür bräuchte ich ein Makro für folgendes Problem:
Zum einen soll die Spalte L der Tabelle 2 (neue Daten) mit der Spalte L der Tabelle 1 (alte Daten) verglichen werden. In dieser Spalte L sind Teilenummern. Wenn eine Teilnummer in dieser Spalte neu hinzugekommen ist in Tabelle 2 soll die komplette Zeile der Tabelle 2 mit der neuen Teilenummer in Tabelle 3 kopiert werden. Tabelle 3 soll zu beginn des Kopiervorgangs immer gelöscht werden
Zum anderen soll aber von der anderen Seite geschaut werden ob in Tabelle 2 (neue Daten) Teilenummern weggefallen sind. D.h. Tabelle 1 (alte Daten) Spalte L soll mit Tabelle 2 (neue Daten) Spalte L verglichen werden. Wenn in Tabelle 1 in Spalte L eine Teilenummer ist die in Tabelle 2 (neue Stand) nicht mehr vorhanden ist soll auch diese ganze Zeile in Tabelle 4 kopiert werden. Diese Tabelle soll vorher aber nicht gelöscht werden, sondern die weggefallenen Teilenummer sollen zur alten Liste ergänzt werden die ggf. vom vorherigen ausführen des Makros in Tabelle 4 stehen.
Ich hoffe ihr könnt mir weiterhelfen.
Vielen Dank im Voraus

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2 Listen vergleichen
18.07.2016 13:15:35
Michael
Hallo!
Lad doch bitte eine Bsp-Mappe hoch, mit den 4 relevanten Blättern und einer beispielhaften Menge an echten Teilenummern (so wie sie bei Dir vorhanden sind), ich sag mal so 30 Nummern - und zwar gleich so, dass alle von Dir beschriebenen Fälle vorkommen (also neue Daten nicht in Tab 1 und alte Daten in Tab 1 die nicht in Tab 2 sind) - somit können Lösungsvorschläge gleich am lebenden Objekt getestet werden.
Niemand von uns baut erst gerne irgendwelche Mappen auf, um Dir eine Lösung zu bieten, die dann möglicherweise nochmal umgebaut werden muss, weil die Verhältnisse in Deiner Mappe andere sind.
LG
Michael
Anzeige
AW: 2 Listen vergleichen... mal zum Testen
18.07.2016 15:42:10
Christian
Hi,
hier mal ein erster Wurf zum ausprobieren.
Gruß, Christian
Option Explicit
Sub Abgleich()
Dim maxRN As Integer
Dim maxRA As Integer
Dim wsN As Worksheet
Dim wsA As Worksheet
Dim wsZ As Worksheet
Dim i, ii As Long
Dim idCol As Integer
Set wsN = ThisWorkbook.Worksheets("Neue_Daten")
Set wsA = ThisWorkbook.Worksheets("Alte_Daten")
Set wsZ = ThisWorkbook.Worksheets("Neue_Teile")
' Spaltennummer mit Artikelnummer
idCol = 11
maxRN = wsN.Cells(wsN.Rows.Count, idCol).End(xlUp).Row
maxRA = wsA.Cells(wsA.Rows.Count, idCol).End(xlUp).Row
'Liste auf blatt 'neue teile' löschen
Call Weg(wsZ)
'' Steht die Id in der Alten Liste?
For i = 2 To maxRN
If IstDa(wsN.Cells(i, idCol), wsA, idCol) = False Then
wsN.Cells(i, idCol).EntireRow.Copy Destination:=wsZ.Cells((wsZ.Rows.Count), idCol). _
End(xlUp).Offset(1, 0).EntireRow
End If
Next i
Set wsZ = ThisWorkbook.Worksheets("Alte_Teile")
' und anders herum?
For i = 2 To maxRA
If IstDa(wsA.Cells(i, idCol), wsN, idCol) = False Then
wsA.Cells(i, idCol).EntireRow.Copy Destination:=wsZ.Cells((wsZ.Rows.Count), idCol). _
End(xlUp).Offset(1, 0).EntireRow
End If
Next i
End Sub
Private Function IstDa(ByRef ArtID As String, ByRef ws As Worksheet, idCol) As Boolean
Dim i As Long
For i = 2 To ws.Cells(ws.Rows.Count, idCol).End(xlUp).Row
If ArtID = ws.Cells(i, idCol) Then
IstDa = True
Exit Function
End If
Next
IstDa = False
End Function
Private Sub Weg(ws As Worksheet)
ws.Range("A2:" & Cells(Rows.Count - 1, Columns.Count).Address).Clear
End Sub

Anzeige
Ich verstehe Deine Bsp-Daten nicht...
18.07.2016 18:06:09
Michael
Dauth,
...zum einen sind ja schon in den jeweiligen Listen "Alte Daten" bzw. "Neue Daten" Teilenummern mehrfach vorhanden. Aber gut, das mag ja noch einen Grund haben, aber Deine Beispiele in "Neue Teile" bzw. "Alte Teile" verstehe ich nicht...
Warum findet sich zB die Teilenummer 55561993 im Blatt "Neue Teile"? Diese Nummer ist sowohl in "Neue Daten" als auch "Alte Daten" vorhanden. Ich dachte in "Neue Teile" sollen nur jene Datensätze die in "Neue Daten" aufscheinen aber NICHT in "Alte Daten" vorhanden sind? Gleiches gilt für die Teilenummern 24456186 und 23192304.
Genauso verstehe ich nicht, woher die Teilenummern 12345678 bzw. 12345679 in "Alte Teile" kommen. Diese sind beide nicht in "Alte Daten" vorhanden. Ich dachte es sollen nur jene Datensätze nach "Alte Teile" kopiert (=/= verschoben) werden, die in "Alte Daten" vorhanden aber in "Neue Daten" NICHT vorhanden sind.
Ergibt für mich so keinen Sinn, daher vorerst von mir keine Lösung.
LG
Michael
Anzeige
AW: Ich verstehe Deine Bsp-Daten nicht...
19.07.2016 09:51:49
Dauth
Also es kann immer vorkommen das in dem Datensatz Alte Daten es Daten gibt die es auch in Neue Daten gibt. Bei diesen beiden Ordnern handelt es sich um Daten die vom System aus einer Bestandsliste gezogen werden. D.h. es kommt zu 100% vor das in diesem Ordner, da dort über 100000 Teile sind viele in beiden Sheets vorkommen. Die Ordner Alte und Neue Teile sind dagegen anders. Im Ordner Alte Teile sollen Teile permanent abgelegt werden die beim ausführen des Makros in der alten Liste sind und in der neuen Liste nicht mehr vorkommen. Das Sheet neue Teile dagegen ist dafür da das man sieht wenn im System neue Teile eingepflegt worden sind. Sie soll vor dem einfügen erst einmal gelöscht werden, so das nur Teile dort stehen die wirklich gerade dazu gekommen sind.
Ich weiß das es etwas kompliziert ist, deshalb schreibe ich auch hier.
Anzeige
Teste mal...
19.07.2016 12:59:16
Michael
Hallo Dauth,
...folgenden Code, bezogen auf Deine letzte Bsp-Datei:
Sub Vergleich()
Dim Wb As Workbook
Dim WsAlt As Worksheet
Dim WsNeu As Worksheet
Dim TeileAlt As Worksheet
Dim TeileNeu As Worksheet
Dim arrAlt, arrNeu
Dim i As Long, z As Long, s, j As Long
Dim clc
With Application
clc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
Set Wb = ThisWorkbook
With Wb
Set WsAlt = .Worksheets("Alte_Daten")
Set WsNeu = .Worksheets("Neue_Daten")
Set TeileAlt = .Worksheets("Alte_Teile")
Set TeileNeu = .Worksheets("Neue_Teile")
End With
With WsAlt
arrAlt = Application.Transpose(.Range("K2:K" & _
.Cells(.Rows.Count, 11).End(xlUp).Row))
End With
With WsNeu
arrNeu = Application.Transpose(.Range("K2:K" & _
.Cells(.Rows.Count, 11).End(xlUp).Row))
End With
With TeileNeu
.Cells.Clear
WsNeu.Range("A1:K1").Copy
.Range("A1").PasteSpecial xlPasteValues
.Range("A1").PasteSpecial xlPasteFormats
End With
On Error Resume Next
For i = LBound(arrNeu) To UBound(arrNeu)
s = Application.Match(arrNeu(i), arrAlt, 0)
If IsError(s) Then
Err.Clear
z = i + 1
WsNeu.Range(Cells(z, 1), Cells(z, 11)).Copy
With TeileNeu
j = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(j, 1).PasteSpecial xlPasteValues
.Cells(j, 1).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End If
Next i
For i = LBound(arrAlt) To UBound(arrAlt)
s = Application.Match(arrAlt(i), arrNeu, 0)
If IsError(s) Then
Err.Clear
z = i + 1
WsAlt.Range(Cells(z, 1), Cells(z, 11)).Copy
With TeileAlt
j = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(j, 1).PasteSpecial xlPasteValues
.Cells(j, 1).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End If
Next i
With Application
.Calculation = clc
.ScreenUpdating = True
End With
Set Wb = Nothing
Set WsAlt = Nothing
Set WsNeu = Nothing
Set TeileAlt = Nothing
Set TeileNeu = Nothing
Erase arrAlt
Erase arrNeu
End Sub
Testen bitte immer in einer Kopie, nicht in produktiven Tabellen!
LG
Michael
Anzeige
AW: Teste mal...
20.07.2016 10:18:41
Dauth
Danke erst mal für die Daten.
Also das mit den Alten Daten passt soweit ich das jetzt sehen kann super. Er kopiert sie in das Sheet und bei weiteren Daten hängt er sie hinten dran, also genauso wie er es sollte. Und er lässt die erste Zeile (also die Headline aus) Perfekt!!!
Die neuen Daten gehen leider nicht. Dort kopiert er nur die erste Zeile rein und das war es.
Probier's nochmal so...
20.07.2016 10:53:56
Michael
Hallo Dauth,
...kriegen wir noch hin ;-):
Sub ListenVergleichUndKopie()
Dim Wb As Workbook
Dim WsAlt As Worksheet
Dim WsNeu As Worksheet
Dim TeileAlt As Worksheet
Dim TeileNeu As Worksheet
Dim arrAlt, arrNeu
Dim i As Long, z As Long, j As Long
Dim s
Dim clc
Dim t
With Application
clc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
Set Wb = ThisWorkbook
With Wb
Set WsAlt = .Worksheets("Alte_Daten")
Set WsNeu = .Worksheets("Neue_Daten")
Set TeileAlt = .Worksheets("Alte_Teile")
Set TeileNeu = .Worksheets("Neue_Teile")
End With
With WsAlt
arrAlt = Application.Transpose(.Range("K2:K" & _
.Cells(.Rows.Count, 11).End(xlUp).Row))
End With
With WsNeu
arrNeu = Application.Transpose(.Range("K2:K" & _
.Cells(.Rows.Count, 11).End(xlUp).Row))
End With
With TeileNeu
.Cells.Clear
WsNeu.Range("A1:K1").Copy
.Range("A1").PasteSpecial xlPasteValues
.Range("A1").PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
On Error Resume Next
For i = LBound(arrNeu) To UBound(arrNeu)
s = Application.Match(arrNeu(i), arrAlt, 0)
If IsError(s) Then
Err.Clear
z = i + 1
WsNeu.Range(Cells(z, 1), Cells(z, 11)).Copy
With TeileNeu
j = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(j, 1).PasteSpecial xlPasteValues
.Cells(j, 1).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End If
Next i
For i = LBound(arrAlt) To UBound(arrAlt)
s = Application.Match(arrAlt(i), arrNeu, 0)
If IsError(s) Then
Err.Clear
z = i + 1
WsAlt.Range(Cells(z, 1), Cells(z, 11)).Copy
With TeileAlt
j = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(j, 1).PasteSpecial xlPasteValues
.Cells(j, 1).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End If
Next i
With Application
.Calculation = clc
.ScreenUpdating = True
End With
Set Wb = Nothing
Set WsAlt = Nothing
Set WsNeu = Nothing
Set TeileAlt = Nothing
Set TeileNeu = Nothing
Erase arrAlt
Erase arrNeu
End Sub
Wie immer: Testen in einer Kopie, nicht der Produktiv-Datei!
LG
Michael
Anzeige
AW: Probier's nochmal so...
20.07.2016 11:50:04
Dauth
Nein klappt immer noch nicht. Also mit den neuen Teilen ist es immer noch das Gleiche, nur die erste Zeile wird mit dem Headliner gefüllt und die Alten_Teile erstellt er jetzt gar nicht mehr.
Hmm... Kann ich noch nicht nachvollziehen,...
20.07.2016 12:01:22
Michael
Dauth,
...zumal ich das auf Basis Deiner Bsp-Mappe getestet habe.
Ich schau's mir aber nochmal an und melde mich...
LG
Michael
So, nochmal sauber...
20.07.2016 12:45:51
Michael
Hallo Dauth!
Hab's nochmal "von Null" geschrieben, kann sein, dass ich in der Eile beim vorigen Code irgendwo schlampig war.
Bitte teste folgenden Code (wieder auf Basis Deiner Bsp-Mappe erstellt). Diesmal sollte alles wie gewünscht klappen:
Sub ListenAbgleichen()
'Wenn Teilenummer aus Neue_Daten nicht in Alte_Daten, dann diesen Datensatz
'in Neue_Teile kopieren
'Neue_Teile soll vor dem Vorgang geleert werden
'Wenn Teilenummer aus Alte_Daten nicht in Neue_Daten, dann diesen Datensatz
'in Alte_Teile kopieren (wird zuvor NICHT geleert)
Dim Wb As Workbook
Dim DatenNeu As Worksheet
Dim DatenAlt As Worksheet
Dim TeileNeu As Worksheet
Dim TeileAlt As Worksheet
Dim arrNeu, arrAlt
Dim i As Long, j As Long, s, z As Long
Dim clc
With Application
clc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
Set Wb = ThisWorkbook
With Wb
Set DatenNeu = .Worksheets("Neue_Daten")
Set DatenAlt = .Worksheets("Alte_Daten")
Set TeileNeu = .Worksheets("Neue_Teile")
Set TeileAlt = .Worksheets("Alte_Teile")
End With
With TeileNeu
.Cells(2, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 11).Clear
End With
With DatenNeu
arrNeu = Application.Transpose(.Range("K2:K" & .Cells(.Rows.Count, 11).End(xlUp).Row))
End With
With DatenAlt
arrAlt = Application.Transpose(.Range("K2:K" & .Cells(.Rows.Count, 11).End(xlUp).Row))
End With
For i = LBound(arrNeu) To UBound(arrNeu)
s = Application.Match(arrNeu(i), arrAlt, 0)
If IsError(s) Then
j = i + 1
With DatenNeu
.Range(.Cells(j, 1), .Cells(j, 11)).Copy
With TeileNeu
z = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(z, 1).PasteSpecial xlPasteValues
.Cells(z, 1).PasteSpecial xlPasteFormats
End With
End With
End If
Next i
For i = LBound(arrAlt) To UBound(arrAlt)
s = Application.Match(arrAlt(i), arrNeu, 0)
If IsError(s) Then
j = i + 1
With DatenAlt
.Range(.Cells(j, 1), .Cells(j, 11)).Copy
With TeileAlt
z = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(z, 1).PasteSpecial xlPasteValues
.Cells(z, 1).PasteSpecial xlPasteFormats
End With
End With
End If
Next i
MsgBox "Listen wurden abgeglichen!", vbInformation, "Fertig!"
With Application
.Calculation = clc
.ScreenUpdating = True
.CutCopyMode = False
End With
Set Wb = Nothing
Set DatenNeu = Nothing
Set DatenAlt = Nothing
Set TeileNeu = Nothing
Set TeileAlt = Nothing
Erase arrNeu
Erase arrAlt
End Sub
LG
Michael
Anzeige
Na, wie sieht's aus? Passt der Code jetzt?
21.07.2016 15:09:19
Michael
Hallo Dauth!
Rückmeldung würde mich noch freuen!
LG
Michael
AW: Na, wie sieht's aus? Passt der Code jetzt?
22.07.2016 09:52:34
Dauth
So ich habe es nun mal getestet im vollen Umfang und es funktioniert einwandfrei. Es ist auch in meinem vorhandenen Macro eingebunden und macht immer noch alles was es soll.
Vielen Dank. Super Hilfe.
Super, freut mich! Gerne und LG, owT
22.07.2016 10:16:31
Michael
AW: Super, freut mich! Gerne und LG, owT
22.07.2016 10:39:55
Dauth
Eine Zusatzfrage habe ich noch
AW: Na, wie sieht's aus? Passt der Code jetzt?
22.07.2016 10:22:20
Dauth
Ich habe noch einen Punkt den das Tool machen könnte. Also ein Nice to have ;-)
In Spalte C sind Nummern z.B. 50.02.01.98 . Wenn die Nummer 50.02.01.98 und 70.02.03.03 z.B. in Spalte C steht soll in einer Spalt X, z.B. Spalte "DA" der Name des Mitarbeiters eingetragen werden der in einer Liste steht, weil dieser Mitarbeiter für dieses Teil zuständig ist.
Siehe Beispiel:
https://www.herber.de/bbs/user/107160.xlsx
Anzeige
Nachfrage...
22.07.2016 10:57:53
Michael
Hallo!
Nicht unverschämt werden, Andi! ;-)
Solche Nummern kommen in Deiner ursprünglichen Bsp-Datei in Spalte C, sowohl in "Alte_Daten" als auch "Neue_Daten", aber nur sporadisch vor; sonst finden sich dort auch diverse Bezeichnungen.
Zudem: WO sollten denn die Mitarbeiter-Referenzierungen dann eingetragen werden? In "Alte_Daten", "Neue_Daten", "Neue_Teile" oder "Alte_Teile"? Ich vermute mal, dass das schon in den Datenlisten (also "Alte_Daten" bzw. "Neue_Daten") angezeigt werden soll. Dazu wäre es einfacher, eine zusätzliche Spalte direkt in den Datenlisten anzulegen, die sich zB per SVERWEIS den Mitarbeiter-Namen aus der Liste holt - um einen SVERWEIS zu nutzen müsstest Du aber die Liste umbauen, das wird in der Art, wie Du sie im letzten Upload gezeigt hast, nix.
Der Vorteil wäre so, dass das nicht im Code irgendwie kompliziert zu berücksichtigen ist, sondern, dass die entsprechende Spalte einfach mitkopiert wird, und der SVERWEIS sich dennoch den richtigen Namen holt.
Fraglich ist außerdem - WO liegt die Referenzliste? Auch in dieser Mappe, als eigenes Tabellenblatt...
Du siehst - aus einem "Nice to have" wird schnell ein Projekt ;-)...
LG
Michael
Anzeige
AW: Nachfrage...
22.07.2016 11:07:36
Dauth
Ja ich weiß das ich jetzt aber unverschämt werde :-D
Ja es ich möchte eine Liste erstellen wo jeder Nummer (Spalte C) einem Mitarbeiter zugeordnet werden soll und wenn es dafür keinen Mitarbeiter gibt dann bleibt sie leer.
Das Macro soll am Besten nach dem Befüllen des Makros "Sub ListenAbgleichen()" einfach das Sheet noch einmal durch geht und dann nach der Liste die ich eben angehängt habe die Spalte DA befüllt. Also die Nummer aus der Spalte C nach der Liste wo die Nummern (beliebig viele die unter dem Mitarbeiter steht) zuordnet. DIe Liste der Mitarbeiter kann ich auch anpassen wenn es für das schreiben des Macros besser wäre.
Okay, aber...
22.07.2016 11:29:45
Michael
hi,
...d.h. die Referenzliste ist auch in dieser Mappe. Gut, umbauen wird notwendig sein.
Aber zu Das Macro soll am Besten nach dem Befüllen des Makros "Sub ListenAbgleichen()" einfach das Sheet noch einmal durch geht und dann nach der Liste die ich eben angehängt habe die Spalte DA befüllt....
WELCHES Sheet? "Neue_Teile" oder "Neue_Daten" oder... ?
LG
Michael
Ich bin dann mal im WE, bin Mo wieder im Forum owT
22.07.2016 14:27:10
Michael
AW: Ich bin dann mal im WE, bin Mo wieder im Forum owT
27.07.2016 13:12:17
Dauth
Ja die Referenzliste ist in dieser Datei unter dem Sheetnamen "Mitarbeiter".
Ich kann sie aufbauen wie es am Besten wäre. Müsste nur wissen wie es am geschicktesten ist.
Genau er soll nach dem Befüllen der Listen "Neue_Daten" die Spalte DA befüllen.
AW: Okay, aber...
25.07.2016 07:26:20
Dauth
Am Besten das Sheet "Neue Teile"
AW: Okay, aber...
25.07.2016 07:31:57
Dauth
Und ja die Referenzliste wird in dieser Mappe sein. Ich kann sie aufbauen wie es am Besten wäre. Müsste nur wissen wie es am geschicktesten ist.
AW: Okay, aber...
27.07.2016 10:25:56
Dauth
Ja die Referenzliste ist in dieser Datei unter dem Sheetnamen "Mitarbeiter".
Ich kann sie aufbauen wie es am Besten wäre. Müsste nur wissen wie es am geschicktesten ist.
Genau er soll nach dem Befüllen der Listen "Neue_Daten" die Spalte DA befüllen.

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige