2016-08-05 20 views
0

Ich bin fest, wie man ein Problem logisch angehen kann, da es 2-dimensionale Arrays erfordern könnte, oder vielleicht überdenke ich das Problem.Excel VBA - Vergleichen von Spaltendaten mit eindeutigen Bezeichnern

Ich habe zwei Datenblätter. Jedes Datenblatt hat eine Liste von eindeutigen Identifizierern und eine Handvoll von Daten, die jedem Identifizierer zugeordnet sind. Leider (und das ist, wo ich stecken bleibe), ist die Anzahl der Daten, die mit jeder Kennung verbunden sind, nicht immer gleich, so dass ich Schwierigkeiten habe, die Daten zu vergleichen.

Zum Beispiel, hier ist eine Probe aus Sheet1:

1 | 06/08 
1 | 06/15 
1 | 06/16 
1 | 06/17 
1 | 06/22 
1 | 06/23 
1 | 06/30 
1 | 07/01 
1 | 07/05 
1 | 07/06 
1 | 07/07 
1 | 07/12 
1 | 07/15 
1 | 07/18 
2 | 06/24 
2 | 06/30 
2 | 07/05 
2 | 07/06 
2 | 07/07 
2 | 07/08 
2 | 07/14 

Und hier ist eine Probe aus Blatt 2:

1 | 06/07 
1 | 06/16 
1 | 06/17 
1 | 06/23 
1 | 07/06 
1 | 07/07 
1 | 07/18 
1 | 06/21 
1 | 06/28 
1 | 07/08 
1 | 07/14 
2 | 06/09 
2 | 07/13 

Grundsätzlich ist dieser vermeintliche Fortschritt für jeden Bezeichner nach Datum überprüfen . Die Daten in Sheet1 haben Verpflichtungstermine, wenn das Projekt aktualisiert werden soll. Die Daten in Sheet2 enthalten die Daten, zu denen das Projekt tatsächlich für diese Sequenz aktualisiert wurde.

Die grundlegende Logikschleife besteht darin, alle eindeutigen Bezeichner zu übernehmen und sie vermutlich in einem Array zu speichern.

Überprüfen Sie dann für jeden eindeutigen Wert in diesem Array jedes eindeutige Datum für diesen Bezeichner in Sheet1. Gibt es für dieses Datum in Sheet1 ein Datum in Sheet2, das gleich oder früher ist? Wenn ja, wurde das Projekt zu diesem Zeitpunkt erfolgreich aktualisiert.

Aber hier ist der schwierige Teil, dieses Datum auf Sheet2 muss jetzt verworfen werden, da es "verwendet" wurde. Jetzt gehen wir zum nächsten Datum auf Sheet1 für diesen Bezeichner. Gibt es in Sheet2 ein anderes Datum für diese Kennung, das gleich oder früher ist? Und so weiter.

Jede Hilfe, die Sie zur Verfügung stellen können, um diese Logik in VBA zu übersetzen, würde sehr geschätzt werden! Ein einfacher Vergleich wäre einfach, aber diese Komplexität erfordert viel mehr VBA, als ich derzeit kenne.

Antwort

0

Keine Notwendigkeit für VBA. Verwenden Sie diese Formel in C1 auf Sheet1 und ziehen Sie nach unten für alle Ihre Daten:

=B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0) 

Diese Formel wird TRUE zurückgeben, wenn es ein geeignetes aktualisiert Datum und FALSCH findet, wenn das Engagement Datum nicht eingehalten wurde.

EDIT

Zwei weitere Punkte:

  1. Es gibt einen kleinen Fehler, wo die Formel 'update Daten' aus der folgenden Kennung lesen kann. Die korrigierte Version ist:

    =AND(B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0), OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),1,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0)=Sheet1!A1) 
    
  2. Beide Blätter müssen sowohl Kennung sortiert werden ('A' Spalte) und Datum ('B' Spalte)

+0

Das funktionierte perfekt, danke, und ist eine viel elegantere Lösung als das, was ich mit 4 Arrays und VBA erreichen wollte. – yutingxiang

+0

@yutingxiang Ich bin froh, zu helfen. Wenn diese Antwort Ihre Frage gelöst hat, können Sie sie durch Anklicken des Häkchens akzeptieren. Dies zeigt an, dass Sie eine Lösung für die Community gefunden haben. Es besteht keine Verpflichtung, dies zu tun. – hstay