Entfernen Sie doppelte Einträge und behalten Sie nur die neuesten bei

5

Ich habe mehrere Kalkulationstabellen mit Informationen, die ich konsolidieren muss, jede mit unterschiedlichen (und manchmal überlappenden) Teilen des endgültigen Datensatzes, den ich erstellen möchte. In der Regel ist das Kombinieren von Arbeitsblättern mit ähnlichen Daten einfach, indem alle Daten auf ein Blatt kopiert und Duplikate entfernen verwendet werden. Ich möchte jedoch sicherstellen, dass die verbleibenden Werbebuchungen die neueste Version der Duplikate darstellen.

Ich werde die folgenden Daten aus jeder Tabelle importieren:

  • Ein eindeutiges Bezeichnerfeld (UID), das den Betreff der Werbebuchung identifiziert und zum Erkennen von Duplikaten zwischen den Eingabeblättern verwendet wird.
  • Ein Statusfeld (STATUS), das Informationen zu dem im Feld für die eindeutige Kennung aufgerufenen Element enthält.
  • Ein Datumsfeld (DATE), das das Datum enthält, an dem die importierten Daten ursprünglich geschrieben wurden.

Was ich brauche, ist, dass meine Ausgabe nur eine Werbebuchung für jede UID enthält und Daten aus dem Feld STATUS enthält, die mit dem jüngsten DATUM für diese UID aus den Eingabeblättern übereinstimmen.

Was ist der einfachste Weg, dies in Excel zu tun?

Iszi
quelle
Ist VBA eine gültige Option?
Nixda
@nixda Nicht zu bevorzugen, aber ich wäre auch nicht uninteressiert. Das Hauptkriterium ist, dass es von Haus aus in einem Windows 7 + Excel 2010-Build unterstützt wird und dass die Ergebnisse zu 100% zuverlässig sind (oder so nahe wie möglich an 100% liegen). Der einzige Grund, warum ich VBA lieber nicht machen möchte, ist, dass ich es nicht wirklich genug verstehe, um es selbst zu schreiben (und daher auch nicht genug, um wirklich zu verstehen, wozu ein Skript gedacht ist). Wenn dies Ihre Lösung ist, stellen Sie bitte sicher, dass Ihr Skript für Nicht-Initiierte sorgfältig kommentiert ist.
Iszi
Ich habe eine Idee, wie es mit einem Minimum f VBA machbar wäre. Kann ich ein Beispiel für eine Excel-Arbeitsmappe von Ihnen haben?
Nixda
Ich kann momentan noch nichts anfangen, aber der obige Beitrag beschreibt ziemlich genau das Wesentliche. Die UID hat ein Format, das in etwa ###.###.###.###-#####dem von STATUS ähnelt. Es handelt sich um eine Freitexteingabe, und das DATUM wird wie folgt formatiert YYYY/MM/DD.
Iszi
Könnten Sie nicht einfach alle nach Datum sortieren und dann Duplikate entfernen?
Voitcus

Antworten:

5

Ich weiß nicht, ob dies garantiert funktioniert, aber es scheint für mich zu funktionieren (in sehr kleinen Tests in Excel 2007): Nehmen Sie das kombinierte Datenblatt und sortieren Sie es in umgekehrter Reihenfolge nach DATUM, also den neuesten Zeilen sind über den älteren. Dann entfernen Sie Duplikate .

Diese Site bestätigt dieses Verhalten: "Wenn Excel die Tabelle durchsucht, werden alle nachfolgenden Datensätze entfernt, die dieselbe Produkt-ID wie ein früherer Datensatz haben, auch wenn sich die restlichen Daten unterscheiden."

Scott
quelle
2
Ich habe mir erlaubt, eine Referenz hinzuzufügen. Ich habe dies auch mit einem kleinen Test in Excel 2010 bestätigt.
Däne
3

Hier ist eine mehrstufige Lösung, vorausgesetzt, Sie können einen Teil davon manuell ausführen und benötigen keine einzige vollständig automatisierte Lösung.

  1. Excel ist keine Datenbank.
  2. Speichern Sie alle Daten auf einem einzigen Blatt. (Zum Beispiel gehe ich davon aus, dass Sie UID in Spalte A, DATE in Spalte B und den STATUS in C haben).
  3. In einem zweiten Blatt, führt ein Entfernen von Duplikaten auf der UID Spalte nur . (zB kopiere nur gefilterte Uniques oder kopiere die gesamte Spalte und führe dann ein standardmäßiges Remove Duplicates aus).
  4. Fügen Sie in der Spalte DATE die folgende Array * -Formel hinzu:

    {= MAX (WENN (Datenblatt! A: A = A1, Datenblatt! B: B))}

    Dies wählt grundsätzlich das späteste Datum für jede UID aus. (Dies ist natürlich für die erste Reihe, stellen Sie sicher, dass Sie alle übrigen Reihen mit A1, A2, ... füllen.)

  5. Fügen Sie in der Spalte STATUS die folgende Array-Formel hinzu:

    {= INDEX (IF (Datenblatt! A: A = A1, IF (Datenblatt! B: B = B1, Datenblatt! C: C)), MATCH (TRUE, IF (Datenblatt! A: A = A1, IF (Datenblatt! B: B = B1, TRUE)), 0))}

(Beachten Sie wieder die erste Reihe, füllen Sie den Rest).

Dieser ist komplexer, lasst es uns zusammenfassen:

WENN (Datenblatt! A: A = A1, WENN (Datenblatt! B: B = B1, Datenblatt! C: C))

Diese Array-Formel führt einfach das Äquivalent einer SQL WHERE-Klausel mit zwei Bedingungen aus: Geben Sie für alle Zeilen, die sowohl der UID (A-Spalte) als auch dem DATE (B-Spalte) entsprechen, den Wert der Zeile in der C-Spalte (STATUS) zurück.

MATCH (TRUE, IF (Datenblatt! A: A = A1, IF (Datenblatt! B: B = B1, TRUE)), 0)

Die erste Formel hätte gut genug sein sollen, aber da wir nicht die Möglichkeit haben, nur den Wert ungleich Null (oder ungleich FALSCH) herauszuholen, und Excel keine COALESCE-Formel hat, müssen wir ein wenig darauf zurückgreifen Indirektion.
Die MATCH-Formel durchsucht das vom IF zurückgegebene Array (dieselben Bedingungen wie oben, gibt aber einfach TRUE zurück, wenn es eine Übereinstimmung ist) nach dem ersten TRUE-Wert. Der Parameter 3, 0, erfordert eine genaue Übereinstimmung.
Diese Formel gibt einfach den Index der ersten und einzigen Zeile zurück, die mit den vorherigen Bedingungen übereinstimmt (übereinstimmende UID und DATE (dies war das maximale Datum, das mit der UID übereinstimmt)).

{= INDEX (IF ( siehe oben ), MATCH ( siehe oben ))}

Nun ist es einfach genug, den Index der übereinstimmenden Zeile aus dem MATCH zu entnehmen und den entsprechenden STATUS-Wert aus dem IF-Array zu ziehen. Dies gibt einen einzelnen Wert zurück, Ihren neuen STATUS, der garantiert (wenn Sie alle diese Schritte korrekt ausgeführt haben) ab dem neuesten Datum für jede UID ist.

6 Excel ist keine Datenbank.


* FOOTNOTE: Wenn Sie mit Array-Formeln nicht vertraut sind (obwohl ich glaube, dass Sie es sind), sehen Sie dies : Im Grunde geben Sie die ursprüngliche Formel ein, die zu einem Array von Werten führen soll (ohne das verzerrte {}), und drücken Sie dann CTRL+ SHIFT+ ENTER. Excel fügt die Schnörkel {} für Sie hinzu und berechnet alle Werte als Array.

* FOOTNOTE # 2: Im Ernst, EXCEL IST KEINE DATENBANK. ;-)

AviD
quelle
ANMERKUNG: Auf den zweiten Blick denke ich - aber noch nicht gründlich getestet -, dass Sie dies noch weiter vereinfachen können: Der gesamte erste Satz von IF () (der gesamte erste Parameter zu INDEX ()) könnte wahrscheinlich vollständig durch einen einfachen ersetzt werden DataSheet!C:C, da die auf MATCH basierende Indizierung wahrscheinlich genauso gut funktionieren würde. Dies ist ein Ergebnis des Aufbaus der Formel von unten ...
AviD
Übrigens: Durch die Verwendung der Spaltennotation anstelle der spezifischen Bereichsnotation (B: B vs. B1: B2500) wird die Leistung erheblich beeinträchtigt, da Excel Arrays für die gesamte Länge nahezu unendlicher Zeilen erstellen, vergleichen und zusammenstellen muss (okay, nicht ganz unendlich) aber ziemlich viel). Ich habe dies zur Verdeutlichung des Beispiels verwendet.
AviD
HINWEIS 2: Da die verschachtelten IFs im MATCH nur TRUE zurückgeben (wenn beide übereinstimmen), können Sie dies noch weiter vereinfachen, indem Sie die verschachtelten IFs durch ein einfacheres AND () ersetzen. Die endgültige Formel wäre also die viel sauberere:{=INDEX(DataSheet!C:C,MATCH(TRUE,AND(DataSheet!A:A=A1,DataSheet!B:B=B1),0))}
AviD
Getestet die Lösung in der Antwort und es funktioniert, scheint aber ziemlich ressourcenintensiv zu sein. Das Auffüllen von nur einer Handvoll Zeilen dauerte ziemlich lange. Ich bin mir nicht sicher, ob ich es mir vorstellen könnte, gegen die Hunderte / Tausende von Zeilen zu laufen, die mein echtes Blatt haben wird. Ich schätze, das hat vielleicht etwas mit der Spaltennotation zu tun, aber ich verwende die Spaltennotation in vielen anderen ziemlich komplexen Formeln (wenn auch nicht mit Arrays), ohne generell solche Probleme zu haben. Und ja, ich weiß, es liegt wahrscheinlich auch daran, dass Excel keine Datenbank ist.
Iszi
Ausgezeichnet für Erfindungsreichtum, Methodentransparenz (dh: Ich benötige keine Referenz eines Drittanbieters, um mir mitzuteilen, dass dies zuverlässige Ergebnisse liefert) und um die Lösung in einer Arbeitsmappe in sich geschlossen zu halten. Dies ist jedoch nicht sehr gut skalierbar, da es sehr rechenintensiv ist.
Iszi
1

@AviD ist korrekt, da Excel keine Datenbank ist , Sie Ihre Daten jedoch über eine Microsoft Query-Datenquelle in eine andere Tabelle importieren können. Es ist ein bisschen hässlich, gibt Ihnen aber Zugriff auf eine SQL-Anweisung, mit der Sie das bekommen sollten, was Sie wollen.

  1. Wechseln Sie in einer neuen Tabelle zur Registerkarte "Daten" und wählen Sie in der Gruppe "Externe Daten abrufen" die Optionen "Aus anderen Quellen" und "Aus Microsoft-Abfrage" aus.

Bildbeschreibung hier eingeben

  1. Wählen Sie Excel-Dateien und wählen Sie Ihre gespeicherten Daten
  2. Wenn Sie die Fehlermeldung erhalten, dass keine sichtbaren Tabellen gefunden werden, klicken Sie einfach auf OK und wählen Sie im Dialogfeld Optionen die Option Systemtabellen aus der Liste aus. Das sollte Ihnen dann Zugriff auf die Blätter in Ihrem Arbeitsblatt geben

Bildbeschreibung hier eingeben

  1. Fügen Sie der Abfrage Ihre UID-, Status- und Datumsspalten hinzu

Bildbeschreibung hier eingeben

  1. Weiter ... Weiter ... Weiter und wählen Sie Daten anzeigen oder Abfrage in Microsoft Query bearbeiten und dann Fertig stellen

Bildbeschreibung hier eingeben

  1. Jetzt erhalten Sie ein Arbeitsblatt, das ein bisschen wie eine frühe Version von Access aussieht.

Bildbeschreibung hier eingeben

  1. Klicken Sie auf die SQL-Schaltfläche, und Sie erhalten Zugriff auf die Abfrage selbst. Ich denke, Sie müssen die folgenden Einstellungen vornehmen (mit GROUP BY und MAX erhalten Sie das neueste Datum):

    SELECT Sheet1$.UID, Sheet1$.Status, Max ( Sheet1$.Latest) FROM C:\Users\rgibson\Desktop\Book8.xlsx. Sheet1$ Sheet1$ GROUP BY Sheet1$.UID, Sheet1$.Status

    1. Sie können die Abfrage schließen und auswählen, wohin die Daten importiert werden sollen:

Bildbeschreibung hier eingeben

Rhys Gibson
quelle
0

Wenn Sie bereit sind, ein Tool eines Drittanbieters in Betracht zu ziehen, würde ich BeyondCompare empfehlen . Es ist einfach zu bedienen, hat eine sehr großzügige Testversion vor dem Kauf, einen relativ niedrigen Preis und eignet sich sowohl zum Vergleichen als auch zum Zusammenführen vieler verschiedener Dateitypen und Verzeichnisse, einschließlich Excel. Sie können einzelne Zeilen von einer Datei in die andere kopieren.

(Ich bin ein BC-Benutzer und habe nichts mit der Firma zu tun.)

donnerstagswoche
quelle
Ich vermeide lieber Tools von Drittanbietern, aber danke.
Iszi
0

Wenn alles andere fehlschlägt, kombinieren Sie alle Daten auf einem Blatt und sortieren Sie sie nach Datum (stellen Sie sicher, dass sie auf die gleiche Weise formatiert sind). Kopieren Sie dann das aktuellste Datum in eine neue Tabelle und anschließend das nächstaktuelle Datum. Gehen Sie zur Registerkarte Daten und entfernen Sie Duplikate. Da Excel den ersten in die Tabelle eingegebenen Datensatz beibehält und das nächste auftretende Duplikat entfernt, sollte dies funktionieren.

Jean
quelle
0

Das Datenblatt schwenken. Fügen Sie die eindeutige ID in die Zeile und das Datumsfeld in den Wert ein, und legen Sie den Wert auf "Max" fest. Dadurch wird eine zweispaltige Tabelle mit der UID und dem mit dieser UID verknüpften Datum erstellt. Formatieren Sie die Wertespalte in der Pivot-Tabelle so, dass sie genau dem Wert des Datumsfelds auf der Registerkarte "Daten" entspricht.

Dann habe ich die Pivot-Daten in eine neue Registerkarte kopiert - ich habe sie "Datumsauflöser" genannt - und ich habe einen benannten Bereich für die beiden Spalten A und B erstellt und ich habe den benannten Bereich "Datumsauswahl" genannt, den Sie so nennen können, wie Sie möchten. Ich habe den Bereich tatsächlich auf $ A: $ B festgelegt, damit er bereit ist, wenn ich später zurückkomme und zusätzliche Zeilen hinzufüge.

Dann ging ich zurück zur Datentabelle und fügte zwei Spalten hinzu. Eine AV-Suche, die die UID eingibt und das maximale Datum aus dem Bereich "date_selector" zurückgibt, und dann eine einfache if-Anweisung, um die Zeilen beizubehalten, in denen das Datum aus dem Bereich "date_selector" mit dem Datum im Datensatz übereinstimmt.

Meine eindeutige ID befindet sich in Spalte M Das Datum befindet sich in Spalte H Der VLOOKUP-Datumswert befindet sich in Spalte A

VLOOKUP = VLOOKUP (M2, date_resolver, 2, FALSE)

IF STATEMENT = IF (A2 = H2, "KEEP", "DELETE")

In Zukunft muss ich lediglich den Pivot aktualisieren, die Pivot-Ergebnisse in die Registerkarte date_resolver einfügen, meine Formelzeilen nach unten einfügen und die gelöschten Zeilen löschen.

(tief in der Kiste nachdenkend)

T-Rex
quelle