Montag, Mai 25, 2020

Excel vba Zeilen vergleichen von zwei Arbeitsmappen und ersetzen

Hier ist ein wenig hintergrund auf, was ich versuche zu erreichen.

Ich habe eine excel-Datei, die enthält 10 Blatt und die einzelnen Blätter enthalten viele Zeilen von Daten. Diese Arbeitsmappe ist an verschiedene Menschen und jeder füllt in Ihren jeweiligen info,nur in den Spalten A,B. ich habe ein vba script, welches eine Schleife über alle ausgefüllten Arbeitsmappen, und prüft, welche Zeilen Zellen Ax, Bx gefüllt. Dann kopiert diese in eine neue Arbeitsmappe.

Also, was ich jetzt haben, ist:

  1. Eine Arbeitsmappe, die enthält nur die Zeilen der Spalten A,B besetzt worden.
  2. Eine Arbeitsmappe, die enthält alle unbesetzten Reihen. (der erste)

Was ich jetzt machen möchte, ist zu überprüfen, Zeile für Zeile, und finden Sie z.B. Zeile 1 der Tabelle1 der Arbeitsmappe Eine, minus den Spalten A,B in der Arbeitsmappe B Blatt 1. Nach der Zeile gefunden wird, muss ich ersetzen Arbeitsmappe B Zeile mit der von Arbeitsmappe Eine.

Sodass ich mit der linken, eine master-Arbeitsmappe (bisher Arbeitsmappe B), die sowohl gefüllt als auch ungefüllt Zeilen.

Ich hoffe, ich habe dies nicht zu kompliziert. Jeder Einblick auf was ist der beste Weg, dies zu erreichen, wäre geschätzt.

  • Any insight on what is the best way to achieve this would be appreciated. Was nach Ihnen ist der beste Weg? Sie müssen einige dran gedacht 🙂 Haben Sie versucht jeglichen code noch? Zeigen Sie uns den code, den Sie versucht und auf der Grundlage, dass können wir Ihnen sagen, wenn das der beste Weg ist oder ob es verbessert werden kann 😉
  • Gut, die Art und Weise, die ich im Sinn hatte, ist die einfachste, die ich denken konnte. Die Schleife durch die Zeilen der ersten Arbeitsmappe, finden Sie in der zweiten Arbeitsmappe, und ersetzen Sie Sie. Mit dieser sagte, ich weiß nicht, wie zu vergleichen reicht. workbook1.Tabelle1.range(„C1:F1“) = orkbook2.Tabelle1.range(„C1:F1“) ? Und dann ersetzen Sie die gesamte Zeile. Ich habe nicht irgendwelche code noch, da bin ich mir nicht sicher, ob dies der beste Weg. Es gibt viele Linien von Daten, und es könnte ein overkill auf diese Weise.
  • Ja Looping wird ein overkill. Sie möchten möglicherweise verwenden Sie .FIND Sehen, ob dies wird Ihnen den Einstieg. siddharthrout.wordpress.com/2011/07/14/…
  • Dieses sieht wie es wird gut funktionieren. Danke. Ich werde wieder mit Fortschritt, sobald ich habe einige 🙂
  • Nun, ich bin in der Lage zu geben .finden Sie ein range-Objekt zu suchen, aber die Ergebnisse sind nicht korrekt. Gibt es eine Anleitung, wie man verwenden .finden Sie suchen für eine Reihe? Von dem, was ich verstehe, aber ich muss zuerst konvertieren Sie die Auswahl in ein array und überprüfen Sie Zelle für Zelle. Wenn das wirklich der Fall es irgendwie Niederlagen der Zweck, nicht wahr?
  • Nein ist es nicht, als es keine Schleife die Zelle wie eine for-Schleife funktioniert. Wenn Sie hochladen können ein Beispiel-Arbeitsmappe, dann vielleicht kann ich Ihnen ein Beispiel zeigen?
  • Hm ok. Hier ist ein Beispiel-Arbeitsmappen a und b, die ich beschreibe, oben: mediafire.com/?a17og2o43fz7086
  • Du willst also die Kopie von WB-A bis WB-B, wenn eine übereinstimmung gefunden wird? Und ein match wäre, wenn Kol C-Kol L übereinstimmen, nehme ich an?
  • Ja genau. Dieses würde für das Beispiel, aber andere Blätter haben unterschiedliche Spalten-Bereich. Ich denke, es wird ok sein, wenn du mir ein Beispiel für C-L. ich werde in der Lage sein, um es herauszufinden, für den rest.
  • Ok, die Spalte C bis L ist einzigartig? In dem Sinne, das Werte nicht doppelt vorhanden sind, die in dieser Spalte?
  • Von den Daten die ich bisher gesammelt haben, gibt es keinen Hinweis, dass ein Wert in einer Spalte ist einzigartig. Das ist, warum ich brauchen, um mit allen Zellen, um sicherzustellen, dass Ersatz-richtig ist 🙁 Hinweis:ich bin in der Lage, diese Aufgabe manuell mithilfe der erweiterten Filter. Ich weiß nicht, ob es einfacher wäre zu implementieren, die in einem vba-Skript als .finden.
  • Buchung einen code, kurz verwendet .Finden

InformationsquelleAutor kokotas | 2012-08-01

1 Kommentar

  1. 1

    Wie ich bereits in meinen Kommentaren, ist es möglich .Find für das, was Sie versuchen zu erreichen. Die folgenden code-Beispiel Arbeitsmappen geöffnet A und B. Es durchläuft dann die Werte von Col C in der Arbeitsmappe A und sucht nach dem vorkommen des Wertes in Col C-Arbeitsmappe B. Wenn eine übereinstimmung gefunden wird, dann vergleicht es alle Spalten in dieser Zeile. Und wenn alle Spalten übereinstimmen, dann schreibt es auf Col A-und Col B-Arbeitsmappe B basierend auf was der Wert ist in der Arbeitsmappe A. Sobald die übereinstimmung gefunden wird, verwendet es .FindNext für weitere matches in Col C.

    Um dies zu testen, Speichern Sie die Dateien, die Sie mir gab, als C:\A.xls und C:\B.xls beziehungsweise. Jetzt öffnen Sie eine neue Arbeitsmappe und in ein Modul einfügen dieses Codes. Der code ist der Vergleich Sheet7 der Arbeitsmappe A mit Sheet7 der Arbeitsmappe B

    Ich bin sicher, Sie können jetzt ändern für den rest der Blätter

    AUSPROBIERT UND GETESTET (Siehe Snapshot am Ende des Beitrags)

    Sub Sample()
        Dim wb1 As Workbook, wb2 As Workbook
        Dim ws1 As Worksheet, ws2 As Worksheet
        Dim ws1LRow As Long, ws2LRow As Long
        Dim i As Long, j As Long
        Dim ws1LCol As Long, ws2LCol As Long
        Dim aCell As Range, bCell As Range
        Dim SearchString As String
        Dim ExitLoop As Boolean, matchFound As Boolean
    
        '~~> Open File 1
        Set wb1 = Workbooks.Open("C:\A.xls")
        Set ws1 = wb1.Sheets("sheet7")
        '~~> Get the last Row and Last Column
        With ws1
            ws1LRow = .Range("C" & .Rows.Count).End(xlUp).Row
            ws1LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        End With
    
        '~~> Open File 2
        Set wb2 = Workbooks.Open("C:\B.xls")
        Set ws2 = wb2.Sheets("sheet7")
        '~~> Get the last Row and Last Column
        With ws2
            ws2LRow = .Range("C" & .Rows.Count).End(xlUp).Row
            ws2LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        End With
    
        '~~> Loop Through Cells of Col C in workbook A and try and find it
        '~~> in Col C of workbook 2
        For i = 2 To ws1LRow
            SearchString = ws1.Range("C" & i).Value
    
            Set aCell = ws2.Columns(3).Find(What:=SearchString, LookIn:=xlValues, _
                        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                        MatchCase:=False, SearchFormat:=False)
    
            ExitLoop = False
    
            '~~> If match found
            If Not aCell Is Nothing Then
                Set bCell = aCell
    
                matchFound = True
    
                '~~> Then compare all columns
                For j = 4 To ws1LCol
                    If ws1.Cells(i, j).Value <> ws2.Cells(aCell.Row, j).Value Then
                        matchFound = False
                        Exit For
                    End If
                Next
    
                '~~> If all columns matched then wrtie to Col A/B
                If matchFound = True Then
                    ws2.Cells(aCell.Row, 1).Value = ws1.Cells(i, 1).Value
                    ws2.Cells(aCell.Row, 2).Value = ws1.Cells(i, 2).Value
                End If
    
                '~~> Find Next Match
                Do While ExitLoop = False
                    Set aCell = ws2.Columns(3).FindNext(After:=aCell)
    
                    '~~> If match found
                    If Not aCell Is Nothing Then
                        If aCell.Address = bCell.Address Then Exit Do
    
                        matchFound = True
    
                        '~~> Then compare all columns
                        For j = 4 To ws1LCol
                            If ws1.Cells(i, j).Value <> ws2.Cells(aCell.Row, j).Value Then
                                matchFound = False
                                Exit For
                            End If
                        Next
    
                        '~~> If all columns matched then wrtie to Col A/B
                        If matchFound = True Then
                            ws2.Cells(aCell.Row, 1).Value = ws1.Cells(i, 1).Value
                            ws2.Cells(aCell.Row, 2).Value = ws1.Cells(i, 2).Value
                        End If
                    Else
                        ExitLoop = True
                    End If
                Loop
            End If
        Next
    End Sub

    SNAPSHOT

    VOR

    Excel vba Zeilen vergleichen von zwei Arbeitsmappen und ersetzen

    NACH

    Excel vba Zeilen vergleichen von zwei Arbeitsmappen und ersetzen

    • Beeindruckend! Es hat wahrlich funktioniert, danke Siddharth. Ich werde studieren, Ihren code sehr nützliches und einfach zu verstehen für einen Anfänger wie mich.
    • Hm, ich habe versucht, mit es auf der echten sheet7 meiner Arbeitsmappen aber es warf runtime error 424 – Objekt erforderlich, auf der Linie, Wenn ws1.Zellen(i, j).Wert <> ws12.Zellen(aCell.Zeile, j).Wert Dann. Ich werde das prüfen.
    • Sorry, dass war ein Tippfehler. ändern ws12 zu ws2
    • lol, ich sollte es mitbekommen habe, sorry. Es funktioniert perfekt 😀 Jetzt bin ich nur ein foreach-Blatt-Schleife vom Ziel Weg 🙂 Danke nochmal!
    • Fertig und funktioniert 🙂
    • Vielleicht sollten Sie überlegen, upvoting die Lösung ?

Kostenlose Online-Tests