Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
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
Inhaltsverzeichnis

Zwei Sheets vergleichen und umkopieren

Zwei Sheets vergleichen und umkopieren
21.06.2023 17:22:41
Kevin

Hallo zusammen,

ich benötige dringend Unterstützung.
Leider finde ich keine bessere Lösung.
Folgendes:
Es sollen 2 Sheets miteinander abgeglichen und kopiert werden.
Also Sheet 2 (Mit den Änderungen) soll mit Sheet1 (MASTER) Zeile für Zeile verglichen werden. Also nur die in "A1" mit einer eindeutigen Nummer.
Ist die Zeile in er MASTER gefunden soll die Zeile von Sheet2 in Sheet1 kopiert werden.
Das klappt auch soweit. ABER die Sheet1 (MASTER) hat über 15.000 Zeilen.
Der durchlauf dauert über 30min.....
Hatte es auch mal das es 2min gedauert hat aber das hat sich warum auch immer geändert.


HILFE :D

Anbei mein Versuch...

DATEI:
https://www.herber.de/bbs/user/159665.xlsm

Sub AusBereinigung()
    
Dim wkb As Workbook
Dim wkb1 As Workbook
Dim wks As Worksheet
Dim wks1 As Worksheet
Dim rng As Range
Dim iRow As Integer
Dim i
Dim Anz As Integer
Dim anz1 As Integer
Dim Z
Dim SuchWert As String
Dim c
Dim s


MsgBox "Vorgang kann bis zu 30min dauern !"


Sheets("Sheet2").Select
If ActiveSheet.FilterMode = True Then
      ActiveSheet.ShowAllData
   End If

 Range("A1").Select
    ActiveWorkbook.Worksheets("Sheet2").ListObjects("TabelleSheet2").Sort. _
        SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet2").ListObjects("TabelleSheet2").Sort. _
        SortFields.Add Key:=Range("A1:A7361"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet2").ListObjects("TabelleSheet2"). _
        Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Application.ScreenUpdating = False
On Error Resume Next
On Error GoTo 0
Set wkb = Workbooks("Umkopieren - TEST.xlsm")
Set wkb1 = Workbooks("Umkopieren - TEST.xlsm")
wkb1.Activate
Set wks = Worksheets("Sheet1") 'wkb.Worksheets("Sheet2")
Set wks1 = Worksheets("Sheet2") 'wkb1.Worksheets("Finale Umlagerungstabelle")
Anz = wks.Cells(65536, 1).End(xlUp).Row
anz1 = wks1.Cells(65536, 1).End(xlUp).Row
For Z = 2 To anz1
SuchWert = wks1.Cells(Z, 1)
With wks.Range("a3:a" & Anz)
Set c = .Find(SuchWert, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
For s = 2 To 25

'Werte einzeln kopieren
wks.Cells(c.Row, s) = wks1.Cells(Z, s)



Next
Else
For s = 1 To 25
wks.Cells(Anz + 1, s) = wks1.Cells(Z, s)
Next
Anz = wks.Cells(65536, 1).End(xlUp).Row
End If
End With
Next
Application.ScreenUpdating = True

End Sub



15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 18:07:03
onur
Also auf deutsch: Sheet "Master" anhand Sheet2 aktualisieren?


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 18:13:17
Knallix
Ja richtig so einfach ist es :D


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 19:06:00
onur
Und warum existieren doppelte Datensätze auf Blatt1 ???


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 19:35:14
Knallix
Oh habe ich gerade auch gesehen. Das kommt von meinem Test vermutlich . Die können aber gelöscht werden.
Hier die Korrektur
https://www.herber.de/bbs/user/159669.xlsm


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 19:37:32
onur
Datei ist kaputt. Lade mal runter...


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 19:56:57
Knallix
Ich kann die ganz normal runterladen und öffnen ?
Habe nur noch Zeilen bis 1000 hinzugefügt


Anzeige
AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 20:27:29
Knallix
Moin, der Ansatz ist schon mal gut.
Geht das noch etwas schneller oder zu großer Aufwand.
DANKE


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 21:40:50
onur
"Der Ansatz ist schon mal gut." ??? Geht es noch?
Mein Code braucht 11 sec für 15000 Zeilen auf Master und 595 auf Sheet2. Wieviel braucht deiner ???


AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 22:54:39
Knallix
Wollte dich damit nicht angreifen. Sorry
Bin jetzt mit Änderungen in meiner Tabelle auf 3min runter.
Das erstmal ok.
Mich Interessieren dennoch auch andere Ansätze.


Anzeige
AW: Zwei Sheets vergleichen und umkopieren
21.06.2023 22:56:46
onur
3min ??
Was ist denn in deiner Tabelle anders?


AW: Zwei Sheets vergleichen und umkopieren
22.06.2023 00:24:14
Yal
Moin,

basierend auf die wie immer gute Arbeit von Onur habe ich 3 zusätzliche Ideen reingebracht:
_ die Listen über einen Array zu lesen,
_ Übertragen in "="-Form, da wir nur die Daten, nicht die Format brauchen,
_ EnableEvents blockieren,

Im Codepane von Sheet1 kommt:
Private Sub CommandButton1_Click()
    AusBereinigung
End Sub
Im Codepane "Modul1" kommt
Private Sub AusBereinigung()
Dim Arr1, Arr2
Dim z
Dim dict
Dim ti
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    Set dict = CreateObject("Scripting.Dictionary")
ti = Timer

'Lesen Ziel-Liste 
    With Worksheets("Sheet1")
        Arr1 = Application.Transpose(Range(.Range("A2"), .Cells(Rows.Count, 1).End(xlUp)).Value)
        ReDim Preserve Arr1(LBound(Arr1) + 1 To UBound(Arr1) + 1) 'sodass Array-Index = ZeileNr
        For z = LBound(Arr1) To UBound(Arr1)
            If dict.exists(Arr1(z)) Then
                Debug.Print "Doppel: " & dict(Arr1(z)) & " - " & z
            Else
            'der Inhalt der Zelle wird als Schlüssel, die ZeileNr als Werte aufgenommen
                dict(Arr1(z)) = z
            End If
        Next
    End With
    
'Lesen Quelle, bei Übereinstimmung übertragen
    With Worksheets("Sheet2")
        Arr2 = Application.Transpose(Range(.Range("A2"), .Cells(Rows.Count, 1).End(xlUp)).Value)
        ReDim Preserve Arr1(LBound(Arr1) + 1 To UBound(Arr1) + 1) 'sodass Array-Index = ZeileNr
        For z = LBound(Arr2) To UBound(Arr2)
            If dict.exists(Arr2(z)) Then Worksheets("Sheet1").Cells(dict(Arr2(z)), 1).Resize(1, 19) = .Cells(z, 1).Resize(1, 19)
        Next
    End With
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox Timer - ti & "sec."
End Sub
VG
Yal


Anzeige
Fehler entdeckt
22.06.2023 07:56:35
Yal
Moin,

Der Copy-Paste Teufel war unterwegs: in der zweiten Schleife heißt es natürlich
ReDim Preserve Arr21(LBound(Arr2) + 1 To UBound(Arr2) + 1)
Und nicht Arr1!

Ziel dabei ist, dass aus einem Array 1 bis n einen 2 bis n+1 gemacht wird. Der Index entspricht dann genau die Zeilenummer.

VG
Yal


AW: Fehler entdeckt
22.06.2023 08:01:49
onur
Und wie lange braucht dein Code?


AW: Fehler entdeckt
22.06.2023 09:48:59
Yal
Korrektur von Korrektur, siehe unten (war heute morgen auf dem Smartphone: zu dicke Finger). Ich habe aber weitere Fehler entdeckt.

Auf dem Beispiel vom TE (nur 1.000 von 15.000 DS in Sheet1), zwischen 1,7 und 2,2 Sek.

Sub AusBereinigung()
Dim Arr
Dim z
Dim dict
Dim ti
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    Set dict = CreateObject("Scripting.Dictionary")
ti = Timer

'Lesen Ziel-Liste
    With Worksheets("Sheet1")
        Arr = Application.Transpose(Range(.Range("A2"), .Cells(Rows.Count, 1).End(xlUp)).Value)
        ReDim Preserve Arr(LBound(Arr) + 1 To UBound(Arr) + 1) 'sodass Array-Index = ZeileNr
        For z = LBound(Arr) To UBound(Arr)
            If dict.exists(Arr(z)) Then
                Debug.Print "Doppel: " & dict(Arr(z)) & " - " & z
            Else
            'der Inhalt der Zelle wird als Schlüssel, die ZeileNr als Werte aufgenommen
                dict(Arr(z)) = z
            End If
        Next
    End With
    
'Lesen Quelle, bei Übereinstimmung übertragen
    With Worksheets("Sheet2")
        Arr = Application.Transpose(Range(.Range("A2"), .Cells(Rows.Count, 1).End(xlUp)).Value)
        ReDim Preserve Arr(LBound(Arr) + 1 To UBound(Arr) + 1) 'sodass Array-Index = ZeileNr
        For z = LBound(Arr) To UBound(Arr)
            If dict.exists(Arr(z)) Then
                Worksheets("Sheet1").Cells(dict(Arr(z)), 1).Resize(1, 19) = .Cells(z, 1).Resize(1, 19).Value
            End If
        Next
    End With
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox Timer - ti & "sec."
End Sub
VG
Yal

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige