2017-10-11 7 views
0

Ich habe mich sehr bemüht, dieses herauszufinden, sehen, ob mir jemand eine Wegbeschreibung geben könnte, bitte.Zeitzählung basiert auf Bedingung

Ich habe ein Arbeitsblatt, in dem ich die Aktivitäten über den Tag (Spalte W), also habe ich einen Bericht für jeden Tag. Jede Aktivität hat einen Typ, der durch einen in einem Dropdown-Menü (Spalte U) aufgeführten Buchstaben definiert ist, z. B. "R" für "Reporting", "M" für "Meeting" usw. und eine Dauer in Stunden (HH: mm) (Spalte S).

Ich möchte, dass mein Arbeitsblatt die gesamte Dauer der Aktivitäten basierend auf ihrem Typ summiert und die Ergebnisse in einer anderen Zelle speichert. In dem beigefügten Bildbeispiel müsste ich 3:30 h für Meeting, 4:30 für Reporting und 2 h für Zeichnung haben.

Was der folgende SumIf-Code tut, ist die Summe aller Stunden, aber es wird nicht für die Dauer berücksichtigt, sobald die Dauer der Unterschied zwischen der Zeit in der nächsten Zeile und der Zeit der Zeile ist, in der das bedingte Argument ist.

Sub test_count_hours() 

Range("E35").Value = WorksheetFunction.SumIf(Range("U8:U37"), "R", Range("S8:S37")) 

End Sub 

So ist mein Kampf, den Code für die Dauer der Ereignisse zu machen.

Beispiel für ein Arbeitsblatt gefüllt

enter image description here

+1

Wenn Sie Hilfe mit Ihrem Code benötigen, geben Sie ihn bitte in Ihre Frage ein. – braX

+0

Sie benötigen 'SumIf', aber bitte, eine @braX erwähnt, poste deinen Code oder was du bisher versucht hast – Moacir

+0

Sie haben @Moacir richtig eingestellt, ich habe meine Frage bearbeitet, ich dachte nur, dass es zu einfach ist, sie einzuschließen, aber ich habe mich geirrt –

Antwort

0

Wie über Ihre Leistungsarten in einem Array zu speichern? Sie können durch jede Aktivität Schleife und dann durch jede Zeile Schleife den Aktivitätstyp zu überprüfen, und fügte hinzu, die Zeit zwischen diesem und dem nächsten Zeile, wenn es eine Übereinstimmung

Sub sumHours() 
Dim activityList As Variant 
Dim activity As Variant 
Dim rowCount As Integer 
Dim countHours As Date 

activityList = Array("M", "R", "Dv") 

Range("U5").Select 
Range(Selection, Selection.End(xlDown)).Select 
rowCount = Selection.Rows.Count 

For Each activity In activityList 
countHours = 0 
    For i = 5 To rowCount + 5 
     If Range("U" & i) = activity Then 
      countHours = countHours + Range("S" & i + 1) - Range("S" & i) 
     End If 
    Next i 

    Select Case activity 
     Case Is = "M" 
     Range("E35") = countHours 

     Case Is = "R" 
     Range("E36") = countHours 

     Case Is = "Dv" 
     Range("E37") = countHours 
    End Select 
Next activity 
End Sub 

(Sicherstellen, dass die Zellen, die die timevalues ​​halten wird formatiert mit dem Datentyp "Time".

+0

Es sieht so aus, als ob Ihre Aktivitäten in Zeile 5 beginnen. Wenn nicht Sie würde die erste ausgewählte Zelle ändern :) – Leroy

+0

Danke, @Leroy, das ist genau das, was ich brauchte! Danke natürlich auch allen anderen. –

Verwandte Themen