2017-04-01 5 views
0

Ich habe ein Blatt (Master), die regelmäßig basierend auf Informationen in einem anderen Blatt (NewData) aktualisiert werden sollte. In Spalte A gibt es eine eindeutige ID in beiden Blättern. Im NewData-Blatt können einige neue IDs vorhanden sein, die auf das Masterblatt übertragen werden sollen. Wenn das NewData-Blatt keine ID hat, die im Masterblatt registriert ist, sollte diese ID (gesamte Zeile) aus dem Masterblatt entfernt werden. Mit anderen Worten: Das NewData-Blatt gibt den Entwurf der ID an, die im Master-Sheet enthalten sein soll.Makro Schleife durch und aktualisieren Sie einige Zellen

Das NewData-Blatt enthält aktualisierte Daten zu einigen Spalten im Master-Arbeitsblatt. Ich kann nicht blind die Information zwischen den zwei Blättern kopieren, weil der Benutzer möglicherweise einen Hyper-Link in der Zelle eingefügt hat, und dieser Hyper-Link sollte nicht gelöscht werden.

Beispiel:

The Master sheet looks like this before update

The NewData sheet looks like this

ich darf nicht mehr als zwei Links posten, also muss ich verbal beschreiben, wie die aktualisierte Master-Blatt wie nach dem Ausführen des Makros aussehen shoukd:

  • Rowid 2001 (Kjell) sollte unverändert sein
  • Rowid 2345 (Vegard) sollte entfernt werden (wie es nicht in der NewData Blatt ist)
  • Rowid 1002 (Fenja) sollte fast wie im ursprünglichen Master, aber mit einer neuen Beschreibung und einem neuen Datum, und jetzt ein Datum ohne den Hyperlink.
  • Rowid 1234() sollte als neue Zeile (ohne Daten in Zelle Name) sein

ich das erraten kann durch relativ einfache VBA-Programmierung gelöst werden, aber ich weiß nicht einmal Grundkenntnisse haben, und nachdem ich eine Menge von Kopieren/Einfügen versucht habe, Vlookup und Index-Match versucht habe und ... Ich habe den Schritt unternommen, um diese Community zu stören ... Sehr froh, wenn mir etwas helfen könnte!

+0

Die Beispiele zeigen nur 3 Datensätze. Ich nehme an, dass dies ein Auszug aus einem viel größeren Datensatz ist. Ich glaube nicht, dass der Code "ziemlich einfach" sein wird. Ich empfehle Ihnen, dies zu einem RDBMS wie Access zu migrieren. Erstellen Sie dann UPDATE- und INSERT-Abfragen, um diese Änderungen auszuführen. Versuchen Sie andernfalls, Code zu entwickeln - versuchen Sie es mit Hilfe des Makroeditors. Wenn Sie Code mit einem bestimmten Problem haben, veröffentlichen Sie ihn zur Analyse. – June7

Antwort

0

Ich nehme an, jede der Zeilen-IDs sind in beiden Arbeitsblättern eindeutig. Wenn dies der Fall ist, können Sie ein Dictionary-Objekt verwenden und es mit allen Werten im Master-Arbeitsblatt füllen. Sobald dies erledigt ist, können Sie das Arbeitsblatt "NewData" durchlaufen und, wenn eine gefundene ID im Wörterbuch vorhanden ist, den Master-Datensatz aktualisieren (dh dieser Datensatz befindet sich sowohl in Master als auch in NewData); Beachten Sie, dass Sie das Wörterbuch Schlüssel/Wert-Paar löschen, sobald dies erledigt ist. Wenn es nicht existiert, dann hängen Sie es an das Ende des Master-Arbeitsblattes an (dh dieser Datensatz befindet sich in NewData, aber nicht in Master).

Danach Schleife vervollständigt die nur Einträge im Wörterbuch sind Schlüssel, die in Master existieren, aber nicht in NewData und können gelöscht werden - das ist, was in der letzten Schleife getan:

Option Explicit 


Sub updateMaster() 
    Dim dict As Object 
    Set dict = CreateObject("Scripting.Dictionary") 

    Dim wrkM As Worksheet: Set wrkM = Worksheets("Master") 
    Dim wrkD As Worksheet: Set wrkD = Worksheets("NewData") 

    Dim r As Integer, r1 As Integer, lr As Integer 
    Dim rng As Range 
    Dim val As String 
    With wrkM: 
    lr = .Range("A" & .Rows.Count).End(xlUp).row 
    For r = 2 To lr: 
     Set rng = .Range("A" & r).EntireRow 
     val = Trim(.Cells(r, "A").Value) 
     Set dict(val) = rng 
    Next 
    End With 
    lr = lr + 1 

    Dim str As Variant 
    With wrkD: 
    For r = 2 To .Range("A" & .Rows.Count).End(xlUp).row: 
     str = Trim(.Cells(r, "A").Value) 
     If dict.Exists(str) Then 
     Set rng = dict(str) 
     r1 = rng.row 
     wrkM.Cells(r1, "B").Value = .Cells(r, "B").Value 
     wrkM.Cells(r1, "E").Value = .Cells(r, "C").Value 
     wrkM.Cells(r1, "D").Value = .Cells(r, "D").Value 
     dict.Remove str 
     Else 
     wrkM.Cells(lr, "A").Value = .Cells(r, "A").Value 
     wrkM.Cells(lr, "B").Value = .Cells(r, "B").Value 
     wrkM.Cells(lr, "D").Value = .Cells(r, "D").Value 
     wrkM.Cells(lr, "E").Value = .Cells(r, "C").Value 
     lr = lr + 1 
     End If 
    Next 
    End With 

    For Each str In dict.keys(): 
    Set rng = dict(str) 
    rng.Delete 
    Next 

End Sub 

Wenn Sie einen zusammenhängenden haben

.Range("A" & r, "B" & r).Copy Destination:=wrkM.Range("A" & lr, "B" & lr) 

aber für nur 2 Reihen ist es nicht so effizient: Bereich können Sie die ersten zwei Zeilen in der anderen Bedingung mit folgenden ersetzen.

+0

Vielen Dank für Ihre Antwort. Es scheint so zu funktionieren, wie ich es wollte, aber ich habe immer noch Probleme, nachdem ich versucht habe, den Code in mein richtiges Arbeitsbuch zu übertragen. Ein Problem, das ich habe, ist die Tatsache, dass ich zwei Blätter habe, die aus der NewData-Datei aktualisiert werden sollen. Ich habe versucht, den ganzen Code zu kopieren und die Kopie von wrkM zu wrkM2 zu ändern, ich werde ein bisschen mehr versuchen und vielleicht zu dir zurückkommen. Eine Frage allerdings: Ist es notwendig, vor dem Ausführen des Makros oder als Teil des Makros eines der Blätter zu sortieren? – Obonden

+0

Sie möchten die Subroutine jeweils zweimal für ein anderes Stammblatt, aber mit demselben NewData-Blatt ausführen? Wenn ja, können Sie das Master-Blatt als Parameter an das Unterprogramm übergeben. Wenn das der Fall ist, kann ich den Code ändern, um das zu tun. Was das Sortieren betrifft, müssen Sie nicht, wenn Sie nicht möchten. – Amorpheuses

+0

Ich werde versuchen, besser zu erklären. Die Benutzer dieser Arbeitsmappe fügen von Zeit zu Zeit neue Daten in das NewData-Blatt ein. Im NewData-Blatt habe ich eine Schaltfläche erstellt, auf die Sie klicken müssen, um das Makro zu aktivieren. Das Makro sollte dann Daten zum Hauptblatt AND das andere Blatt (Master2) übertragen. Im Masterblatt kann der Benutzer seinem Projekt mit einigen Schlüsseldaten folgen. Im Master2-Blatt kann der Benutzer dasselbe tun, aber in diesem Blatt gibt es viel mehr Spalten als im Hauptblatt. Die zusätzlichen Spalten im Master2-Blatt werden vom Benutzer direkt im Blatt aktualisiert. – Obonden

Verwandte Themen