
Ich habe eine Excel 2007-Tabelle mit 2250 Zeilen und 19 Spalten. In diesen Zeilen habe ich möglicherweise zwei Zeilen mit doppelten Kundeninformationen, die kombiniert werden müssen, aber nur, wenn die Zelle darüber leer ist. Ich habe möglicherweise auch Zeilen mit Kundendaten, die nicht kombiniert werden müssen. Eine eindeutige Kundenmitgliedsnummer kann verwendet werden, um die Zeilen zu identifizieren, die kombiniert werden müssen. Ich kämpfe darum, das richtige VBA-Skript zu entwickeln, um die eindeutigen Kundendaten in einer Zeile (oben) zu kombinieren und die Zeile zu löschen, die nach dem Kombinieren übrig bleibt. Ist jemand bereit, mir zu helfen? Es würde mir Stunden/Tage des manuellen Kombinierens dieser Zeilen ersparen und wir befinden uns mitten in einer zeitkritischen Prüfung.
Beispiel unserer Daten:
VORNAME DES MITGLIEDS NACHNAME DES MITGLIEDS MITGLIED # MVP SYSTEM EINTRITTSDATUM ANMELDEDATUM MVP PUNKTE AUSLOSUNG EINTRAGUNGEN ANMELDEFORMULAR? PUNKTE RICHTIG? PUNKTE VERPASST ENDGÜLTIGE PUNKTE AUSLOSUNG EINTRAGUNGEN SP Talon # WP Talon # BD ABTEILUNG MITARBEITER NOTIZEN DLR Gene S 550061 3/2/2013 0 0 0 #Nicht zutreffend Gene S 550061 3/2/2013 1539 137 MC MJ SP Steve G 550087 3/2/2013 30019 1588 PA NR WP Curtis S 550128 24.04.2013 5 0 5 #N/A Curt S 550128 24.04.2013 358 47 MC MJ SP
Bearbeiten (nicht vom OP), um eine durch Pipe/Absatz getrennte Version mit Unterstreichungen für Leerzeichen in Überschriften hinzuzufügen:
VORNAME_ DES MITGLIEDS|NACHNAME_ DES MITGLIEDS|MITGLIEDS#|EINTRAGSDATUM_ DES MVP-SYSTEMS|ANMELDEDATUM|MVP_PUNKTE|AUSZEICHNUNGSEINTRÄGE|ANMELDEFORMULAR?|RICHTIG PUNKTE?|VERPASSTE PUNKTE|ENDPUNKTE|AUSZEICHNUNGSEINTRÄGE|SP_Talon_#|WP_Talon_#|BD|ABTEILUNG|MITARBEITER|ANMERKUNGEN|DLR
Gene|S|550061|02.03.2013||0|0||||0|#N/A|||||||
Gene|S|550061||02.03.2013||||||||1539|137||MC|MJ||SP
Steve|G|550087||02.03.2013||||||||30019|1588||PA|NR||WP
Curtis|S|550128|24.04.2013||5|0||||5|#N/A|||||||
Curt|S|550128||24.04.2013|||||||||358|47||MC|MJ||SP
Antwort1
Ich bin mir nicht ganz sicher, was Ihre Klarstellung angeht, aber hier ist sie trotzdem!:
Wichtiger Punkt: Im Folgenden wird davon ausgegangen, dass innerhalb des MVP-SYSTEM-EINTRITTSDATUMS FÜR MITGLIEDSNR. immer das ANMELDEDATUM steht.
Arbeiten Sie aus Sicherheitsgründen an einer Kopie und fügen Sie jeder Zeile eine Indexnummer hinzu (z. B. „Einfügen“ ColumnA
, „Einsetzen“ , „ 1
In “ und kopieren Sie die Formel nach unten bis Zeile 2250. Kopieren Sie und fügen Sie oben Inhalte/Werte ein).A1
=A1+1
A2
ColumnA
Wählen Sie D2
, Start > Formatvorlagen – Bedingte Formatierung, Neue Regel, Verwenden Sie eine Formel, um zu bestimmen, welche Zellen formatiert werden sollen, Formatieren Sie Werte, bei denen diese Formel zutrifft: Einfügen =AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3))
, Formatieren, Füllen, Gelb auswählen, OK, OK. Geben Sie in Bedingte Formatierung – Regeln verwalten unter Gilt für =$D$2:$D$2250
, Übernehmen ein. OK.
Wählen Sie die gesamte Tabelle aus (klicken Sie auf das Dreieck links neben A und über 1 in den Überschriften), Daten > Sortieren und Filtern – Filtern und wählen Sie bei „ ColumnD
Nach Farbe filtern“ Gelb aus.
Kopieren Sie Zeile1 bis zur letzten blau nummerierten Zeile und fügen Sie sie in A1
ein anderes Blatt (z. B. Blatt2) ein.
In Tabelle 2 löschen F1
, Zellen nach oben verschieben, OK. Außerdem N1:T1
. (Hier ist möglicherweise etwas genaueres Hinsehen erforderlich.)
Fügen Sie ein neues ColumnA
zu Sheet2 hinzu. Setzen Sie 1
in A1
, 2
in A2
, wählen Sie A1:A2
, greifen Sie die untere rechte Ecke der Auswahl, halten Sie die linke Maustaste gedrückt, während Sie so weit wie nötig nach unten ziehen und bis Sie gedrückt halten Ctrl.
Wählen Sie Blatt2, Daten > Sortieren und Filtern – Sortieren, aktivieren Sie „Meine Daten haben Überschriften“, „Sortieren nach“ ColumnA
(das erste der 1
s!), „Nach Werten sortieren“, „Von klein nach groß sortieren“, „OK“.
Notieren Sie die niedrigste Zeilennummer, die 2
in ColumnA
Blatt2 enthalten ist, und die Nummer der höchsten belegten Zeile. Löschen Sie ColumnA
.
Gehen Sie zurück zu Ihrem ersten Blatt und löschen Sie alle Zeilen mit gelber Markierung.
Wählen Sie in Blatt 2 die niedrigere Zeilennummer aus und kopieren Sie alle anderen belegten Zeilen mit einer höheren Nummer und fügen Sie sie wieder unten ColumnA
auf Ihrem ersten Blatt ein.
Hoffentlich wird damit das meiste erreicht, was Sie benötigen – oder, wenn nicht, ist es „ein Schritt in die richtige Richtung“! Zur Kontrolle sollte Ihre letzte belegte Zeile jetzt 2250+1 abzüglich der Differenz zwischen den beiden oben angegebenen Zahlen sein.
Um den VORNAMEN DES MITGLIEDS zu überprüfen, schlage ich vor, eine Nachschlagetabelle mit MITGLIEDSNR. und dieser zu erstellen und dann den VORNAMEN DES MITGLIEDS auf dieser Grundlage in dem Blatt zu vergleichen, von dem Sie eine Kopie erstellt haben. Curt oder Curtis ist vermutlich eine Ermessensentscheidung.
Antwort2
Hier ist ein weiterer möglicher Ansatz. Er hängt von drei Bedingungen ab:
- Es muss eine eindeutige Kennung vorhanden sein, um doppelte von nicht doppelten Feldern zu unterscheiden. In diesem Fall dient das Feld MEMBER# diesem Zweck. In anderen Fällen kann die Kennung aus der Kombination der Werte mehrerer Felder bestehen. Diese Kennung kann der Wert eines einzelnen Felds oder eine Kombination der Werte mehrerer Felder sein.
- Nicht mehr als zwei Duplikate einer Mitgliedsnummer, d. h. keine dreifachen oder höherwertigen „doppelten“ Datensätze.
- Die Zeilen werden nach der Kennung MEMBER# sortiert.
Die Idee besteht darin, eine transformierte Tabelle zu erstellen (am besten rechts neben der vorhandenen Tabelle), die mithilfe von Formeln die Teildaten, die von zwei doppelten Zeilen gemeinsam genutzt werden, in einer einzigen Zeile zusammenfasst, sodass eine ausgefüllte und eine leere Zeile übrig bleiben.
Anschließend kann auf die Ergebnistabelle ein Filter angewendet werden, um die leeren Zeilen auszuschließen. Die ausgefüllten Zeilen können dann an eine andere Stelle kopiert werden.
Wie unten gezeigt, habe ich in Spalte A ein Flag-Feld „DUP“ hinzugefügt: Es ist gleich 1, wenn eine MEMBER# in Spalte C gleich der MEMBER# in der vorhergehenden Zeile ist, und ist andernfalls gleich 0. Die beiden Zeilensätze in den Beispieldaten mit doppelten MEMBER#s sind gelb hervorgehoben.
So sieht die Ergebnistabelle der Formeln aus. Wie erwartet wurden die ergänzenden Informationen, die zwischen zwei Datensätzen geteilt wurden, in einem der Datensätze gesammelt, während der andere Datensatz mit doppelten Strichen („--“) gefüllt blieb. (Die beiden Sätze doppelter Zeilen in den Beispieldaten sind in der Tabelle dunkelblau hervorgehoben.)
Bei Betrachtung der ersten beiden Zeilen der Tabelle, die doppelte Versionen für MEMBER# 550061 enthielten, wurde das zweite „Gen“ in Zeile 4 der Spalte MEMBER_FIRST_NAME durch „--“ ersetzt; das zuvor leere ENROLLMENT_DATE in Zeile 3 wurde jetzt mit 3/2/2013 ausgefüllt und aus Zeile 4 nach oben verschoben; die N/A-Werte für das zweite DRAWING_ENTRIES-Feld (Spalte M in der ursprünglichen Tabelle, Spalte AS in der neuen) wurden durch Leerzeichen ersetzt.
Sie müssen nur noch einen Filter anwenden, die DUP-Spalte als Kriteriumsspalte verwenden, nur die Zeilen auswählen, bei denen DUP gleich 0 ist – und das Ergebnis an einen neuen Speicherort kopieren.
Die zur Konsolidierung der Duplikate verwendeten Formeln sind im Wesentlichen identisch aufgebaut, daher ist es sinnvoll, eine davon genauer zu untersuchen. Hier ist die erste Formel in der Tabelle aus Zelle AH3 für die Spalte MEMBER_FIRST_NAME (ich füge am Ende dieses Beitrags den vollständigen Satz von Formeln für die erste Zeile der Ergebnistabelle ein).
=IF($A3=1, If this is row 2 of a DUP set,
"--", Set value of the result cell to "--"
Otherwise it's a row 1 (maybe a dup, maybe not)
IF($A4=0, Is the following row its dup?
IF(IFERROR(B3="",FALSE),"",B3), No, set result to the value on this row
IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)), Yes, but is this row's value blank or error?
IF(IFERROR(B4="",FALSE),"",B4), Yes, use the value from the following row
IF(IFERROR(B3="",FALSE),"",B3)))) No, use the value from this row
Ein zusätzlicher Kommentar zum Code: Die etwas umständliche Ausdrucksweise IFERROR(<cell address>="",FALSE)
ist erforderlich, um die N/A-Fehlerwerte in einigen Zeilen richtig auszublenden.
Code für die erste Zeile der Ergebnistabelle
DUP =IF(D3=D2,1,0)
FNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(B3="",FALSE),"",B3),IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)),IF(IFERROR(B4="",FALSE),"",B4),IF(IFERROR(B3="",FALSE),"",B3))))
LNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(C3="",FALSE),"",C3),IF(OR(IFERROR(C3="",FALSE),ISERROR(C3)),IF(IFERROR(C4="",FALSE),"",C4),IF(IFERROR(C3="",FALSE),"",C3))))
MEMBER# =IF($A3=1,"--",IF($A4=0,IF(IFERROR(D3="",FALSE),"",D3),IF(OR(IFERROR(D3="",FALSE),ISERROR(D3)),IF(IFERROR(D4="",FALSE),"",D4),IF(IFERROR(D3="",FALSE),"",D3))))
ENTRY DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(E3="",FALSE),"",E3),IF(OR(IFERROR(E3="",FALSE),ISERROR(E3)),IF(IFERROR(E4="",FALSE),"",E4),IF(IFERROR(E3="",FALSE),"",E3))))
ENROL_DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(F3="",FALSE),"",F3),IF(OR(IFERROR(F3="",FALSE),ISERROR(F3)),IF(IFERROR(F4="",FALSE),"",F4),IF(IFERROR(F3="",FALSE),"",F3))))
MVP_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(G3="",FALSE),"",G3),IF(OR(IFERROR(G3="",FALSE),ISERROR(G3)),IF(IFERROR(G4="",FALSE),"",G4),IF(IFERROR(G3="",FALSE),"",G3))))
ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(H3="",FALSE),"",H3),IF(OR(IFERROR(H3="",FALSE),ISERROR(H3)),IF(IFERROR(H4="",FALSE),"",H4),IF(IFERROR(H3="",FALSE),"",H3))))
FORM =IF($A3=1,"--",IF($A4=0,IF(IFERROR(I3="",FALSE),"",I3),IF(OR(IFERROR(I3="",FALSE),ISERROR(I3)),IF(IFERROR(I4="",FALSE),"",I4),IF(IFERROR(I3="",FALSE),"",I3))))
PTS_CORRECT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(J3="",FALSE),"",J3),IF(OR(IFERROR(J3="",FALSE),ISERROR(J3)),IF(IFERROR(J4="",FALSE),"",J4),IF(IFERROR(J3="",FALSE),"",J3))))
PTS_MISSED =IF($A3=1,"--",IF($A4=0,IF(IFERROR(K3="",FALSE),"",K3),IF(OR(IFERROR(K3="",FALSE),ISERROR(K3)),IF(IFERROR(K4="",FALSE),"",K4),IF(IFERROR(K3="",FALSE),"",K3))))
FINAL_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(L3="",FALSE),"",L3),IF(OR(IFERROR(L3="",FALSE),ISERROR(L3)),IF(IFERROR(L4="",FALSE),"",L4),IF(IFERROR(L3="",FALSE),"",L3))))
DR_ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(M3="",FALSE),"",M3),IF(OR(IFERROR(M3="",FALSE),ISERROR(M3)),IF(IFERROR(M4="",FALSE),"",M4),IF(IFERROR(M3="",FALSE),"",M3))))
SP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(N3="",FALSE),"",N3),IF(OR(IFERROR(N3="",FALSE),ISERROR(N3)),IF(IFERROR(N4="",FALSE),"",N4),IF(IFERROR(N3="",FALSE),"",N3))))
WP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(O3="",FALSE),"",O3),IF(OR(IFERROR(O3="",FALSE),ISERROR(O3)),IF(IFERROR(O4="",FALSE),"",O4),IF(IFERROR(O3="",FALSE),"",O3))))
BD =IF($A3=1,"--",IF($A4=0,IF(IFERROR(P3="",FALSE),"",P3),IF(OR(IFERROR(P3="",FALSE),ISERROR(P3)),IF(IFERROR(P4="",FALSE),"",P4),IF(IFERROR(P3="",FALSE),"",P3))))
DEPT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(Q3="",FALSE),"",Q3),IF(OR(IFERROR(Q3="",FALSE),ISERROR(Q3)),IF(IFERROR(Q4="",FALSE),"",Q4),IF(IFERROR(Q3="",FALSE),"",Q3))))
EMPL =IF($A3=1,"--",IF($A4=0,IF(IFERROR(R3="",FALSE),"",R3),IF(OR(IFERROR(R3="",FALSE),ISERROR(R3)),IF(IFERROR(R4="",FALSE),"",R4),IF(IFERROR(R3="",FALSE),"",R3))))
NOTES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(S3="",FALSE),"",S3),IF(OR(IFERROR(S3="",FALSE),ISERROR(S3)),IF(IFERROR(S4="",FALSE),"",S4),IF(IFERROR(S3="",FALSE),"",S3))))
DLR =IF($A3=1,"--",IF($A4=0,IF(IFERROR(T3="",FALSE),"",T3),IF(OR(IFERROR(T3="",FALSE),ISERROR(T3)),IF(IFERROR(T4="",FALSE),"",T4),IF(IFERROR(T3="",FALSE),"",T3))))