2016-11-08 3 views
1

Ich habe eine Excel mit Aktivitäten für verschiedene Kollegen Datei, etwa so:Excel-VBA vergleichen, Zustand, löscht

  • 1 jan Jahr 2016 || 1. Dezember 2016 || 100% || Kollege A
  • 1 Februar 2014 || 31. Dezember 2014 || 100% || Kollege B
  • 1 Januar 2016 || 1. Oktober 2016 || 100% || Kollege B
  • 1 Oktober 2016 || 31. Dezember 2016 || 80% || Kollege B
  • 1. November 2016 || 10. Dezember 2016 || 100% | Kollege B
  • 1 Dezember 2016 || 1. Januar 2017 || 50% || Kollege B

Startdatum || Enddatum || Verwendung% || Kollege

Jetzt was ich möchte, ist zu sehen, woran die Leute gerade arbeiten/wann sie wofür verfügbar sind/seit wann sie verfügbar waren.

Zeilen zu löschen, deren Enddatum in der Vergangenheit liegt, außer das ist die einzige Zeile für einen Kollegen, denn dann möchte ich diese Zeile als Maß für "Seit wann ist er für einen neuen Job verfügbar" sehen.

Aber dann Kollege B zum Beispiel, hat mehrere Dinge im Gange. Wie würde ich alte Sachen entfernen, aber die zwei Zeilen behalten, an denen er arbeitet, + die Zeile, an der er ab dem 1. Dezember arbeiten wird?

Sie können eine Verwendung% von>! 00 das ist in Ordnung.

Sorry für die lange Beschreibung ... Ich bin nicht auf der Suche nach Code, nur die Pseudo-Code/Logik, um dies anzugehen!

+0

Ok wird bearbeiten, offenbar nur die Beispielzeilen von der Spitze meines Kopfes eingegeben. Danke fürs bemerken. – Lodewijk

Antwort

1

Im nicht für Code suchen, nur die Pseudo-Code/Logik

Es scheint mir, dass Sie brauchen nur die folgenden:

  1. Eine einfache Schleife durch jede Zeile zu gehen und schau auf das Enddatum.
  2. Wenn das Enddatum in der Vergangenheit liegt, geht dann 3.
  3. Wenn die Mitarbeiter nur einen Datensatz haben zu dem Schritt, nicht löschen, sonst 4.
  4. Wenn das Enddatum zu Schritt geht in der Vergangenheit, und gibt es mehr als einen Datensatz - löschen.

Wie würde ich mich über alte Sachen zu entfernen, aber die beiden Linien zu halten, die er; s auf jetzt arbeitet die Linie +, die er ab 1. Dezember wird gearbeitet?

Ich glaube einfach zu testen, ob das Enddatum in der Vergangenheit für jedes Szenario ausreicht?


In Pseudo-Code, der wie folgt aussehen könnte:

For i = [num_rows] 
    If end_date < today Then 
     If [COUNTIF(colleague_column, colleague)] > 1 Then 
      rows(i).delete 
     End If 
    End If 
Next 

oder

For i = [num_rows] 
    If end_date < today And [COUNTIF(colleague_column, colleague)] > 1Then 
      rows(i).delete 
    End If 
Next 

oder in tatsächlichen VBA (würden wir Schleife rückwärts im Fall von Löschen von Zeilen) unter der Annahme, dass sich Ihre Daten in Spalten A: D ohne Kopfzeilen befinden:

For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 
    If CDate(Cells(i, 2)) < Date And WorksheetFunction.CountIf(Range("D:D"), Cells(i, 4).Value) > 1 Then 
     Rows(i).EntireRow.Delete Shift:=xlUp 
    End If 
Next 
+0

Es tut uns leid, Sie warten zu lassen. Deine Antwort war genau richtig. Mein Code kam wie folgt aus: http://pastebin.com/zaSPb4v1 ich nicht den Code in diesem Kommentar aufgrund Zeichenbeschränkungen einfügen könnte ... By the way, die Aufwärtsverschiebungswählsignal zu sein scheint unnötig, wie es schon funktioniert - Zellen verschieben. – Lodewijk

+0

Fast vergessen zu sagen, danke! So danke! Markierte deine Antwort als die richtige Antwort. – Lodewijk

+0

Kein Problem. :) –