Ich bin gerade dabei, Daten zu migrieren und habe ein Datenblatt mit über 100.000 Zeilen. Daher brauche ich eine Lösung, die über eine manuelle Aktualisierung hinausgeht.
Für diesen Beitrag werde ich das Problem vereinfachen: Ich habe ein Blatt mit drei Spalten (A, B und C) mit Überschriften [Datentyp] wie folgt: Name [Text], ID [Nummer], CreateDate [Datum]. Die Daten wurden nach Spalte A sortiert, um die doppelten Werte in dieser Spalte bewusst in den Fokus zu rücken. Die IDs sind eindeutig; die Daten sindnichteinzigartig.
Im Beispiel gibt es neun Zeilen, die aufgrund doppelter Werte in Spalte A in drei Gruppen „gruppiert“ werden können. Für die Zeilen 2 und 3 ist der Wert in Spalte A also abc
, für die Zeilen 4, 5 und 6 ist der Wert in Spalte A def
und für die Zeilen 7-10 ist er ghi
.
Die erste Aufgabe besteht darin, das letzte Erstellungsdatum in jeder der „Zeilengruppen“ zu bestimmen. In diesem Beispiel wäre das also der 11.05.1999 für die Zeilen 2 und 3, der 12.03.2001 für die Zeilen 4 bis 6 und der 11.05.1999 für die Zeilen 7 bis 10. Ich mache das, indem ich die Array-Formel {=MAX(IF(A2=$A:$A,$C:$C))}
in Spalte D verwende.
Die nächste Aufgabe erweist sich als schwierig. Nachdem ich nun das neueste Datum für jede Zeilengruppe ermittelt habe, möchte ich die ID, die diesem LatestDate entspricht, in Spalte E (in jeder Zeile der Zeilengruppe) einfügen, sodass das Ergebnis wie Spalte E im folgenden Beispiel aussieht. Aber ich muss dies mit einer Formel/Funktion tun, nicht manuell. Dies ist für ein Migrationsprojekt, also muss es nicht schön sein.
Die passende ID in Spalte E in derselben Zeile einzutragen ist einfach (eine IF-Anweisung) – siehe Zeilen 3, 6 und 9 – aber ich behaupte nicht, dass das die Lösung ist. Aber ich kann nicht herausfinden, wie ich die anderen Zeilen in jeder Gruppe mit derselben ID füllen kann – in meinem beigefügten Beispiel wären das die Zeilen 2, 4 & 5, 7 & 8 und 10. Ich kann nicht einfach in Spalte C nachschlagen, weil diese Werte nicht eindeutig sind. Nach vergeblichen Versuchen mit verschiedenen Formeln bin ich ratlos. Ich vermute, dass es auf Spalte C (die passenden Werte) und Funktionen wie INDEX
und MATCH
... oder vielleicht VBA angewiesen ist.
+------+------+------------+------------+-----------------+
| A | B | C | D | E |
+----+------+------+------------+------------+-----------------+
| 1 | Name | ID | CreateDate | LatestDate | CorrespondingID |
| 2 | abc | 1 | 4/12/1998 | 5/11/1999 | 2 |
| 3 | abc | 2 | 5/11/1999 | 5/11/1999 | 2 |
| 4 | def | 3 | 1/12/1999 | 3/12/2001 | 5 |
| 5 | def | 4 | 5/11/1999 | 3/12/2001 | 5 |
| 6 | def | 5 | 3/12/2001 | 3/12/2001 | 5 |
| 7 | ghi | 17 | 1/17/1999 | 5/11/1999 | 55 |
| 8 | ghi | 42 | 2/4/1999 | 5/11/1999 | 55 |
| 9 | ghi | 55 | 5/11/1999 | 5/11/1999 | 55 |
| 10 | ghi | 83 | 3/28/1999 | 5/11/1999 | 55 |
+----+------+------+------------+------------+-----------------+
Antwort1
Meine Referenz istHier. TLDR: Verwenden Sie die Nicht-Array-Version der Index-Match-Formel.
Geben Sie in E2 Folgendes ein:
=INDEX(B:B,MATCH(1,INDEX((A2=A:A)*(D2=C:C),0,1),0))
Idee: Der interne Index () generiert eine Liste mit 0 und 1, die sowohl dem Namens- als auch dem Datumskriterium entspricht. Anschließend wird der externe Index () verwendet, um den Namen aus A:A zu „laden“.
Antwort2
Diese Lösung verwendet die Offset-Match-Methode. Dabei wird ein Match verwendet, um das Datum zu finden, und dann basierend auf dem Datum ein Offset, um die entsprechende ID zu finden:
=OFFSET(C2,VERGLEICH(D2,C2:C,0)-1,-1)
Legen Sie dies in der Zelle E2 ab und ziehen Sie es dann nach unten über E
Antwort3
Für eine bestimmte Zeile (z. B. Zeile 2) möchten Sie die ID (Spalte B
) aus einer Zeile findenN(d. h. Zelle ), wobei der Name ( ) dem Namen aus der aktuellen Zeile ( ) und das Erstellungsdatum ( ) dem neuesten Datum aus der aktuellen Zeile ( ) entspricht. Zeile Bn
An
A2
Cn
D2
Nist eindeutig, weil die IDs eindeutig sind, und daher „Die” ist die maximale Zeile. Eine logische Antwort wäre eine geringfügige Erweiterung Ihrer Formel für Spalte D
:
=MAX(IF(AND(A2=$A:$A,D2=$C:$C), $B:$B))
Leider AND
scheint das in Array-Formeln nicht zu funktionieren. Wir verwenden also einen Standardtrick:
TRUE
= 1 (oder irgendetwas anderes als Null) und = 0, damit wir mit Multiplikation FALSE
simulieren können ( = genau wie 1 × 1 = 1, = genau wie 0 × AND
AND(TRUE,TRUE)
TRUE
AND(FALSE,anything)
FALSE
irgendetwas = 0). Also ändern wir das obige zu
=MAX(IF((A2=$A:$A)*(D2=$C:$C), $B:$B))
(eingegeben als Matrixformel, natürlich mit Ctrl+ Shift+ ):Enter
Beachten Sie, dass dies mit nicht eindeutigen Erstellungsdaten funktioniert. Es funktioniert sogar, wenn die Erstellungsdaten nicht in derselben Reihenfolge wie die IDs sind, wie im obigen Beispiel (wo die Daten nach Spalten A
und sortiert sind B
).