2016-12-28 1 views
1

Ich versuche, mein Enddatum basierend auf dem Startdatum und der Dauer in der Tabelle zu generieren. Meine Tabelle sind wie folgt:VBA Automatisch die Dauer bis zum Startdatum hinzufügen, um das Enddatum zu generieren

Table column for ID, Task Desc, Start Date, Duration, Planned End Date is A,B,C,D,E respectively

Ich habe versucht, den VBA-Code ausgeführt werden wie folgt, aber es wird nur das Enddatum erzeugen, wenn ich den Unter laufen. Wie kann ich es als automatisch generieren lassen? Der Code sind wie folgt:

Sub PlannedEndDate() 

Dim userInputDate As Date 
Dim duration As Integer 
Dim endDate As Date 

Dim MyRow As Long 

'Start at row 6 
MyRow = 6 
'Loop untill column A is empty (no task) 
While Cells(MyRow, "A").Value <> "" 
    'Only if not yet filled in. 
    If Cells(MyRow, "E").Value = "" Then 
     'Fetch info 
     userInputDate = Cells(MyRow, "C").Value 
     duration = Cells(MyRow, "D").Value 
     endDate = DateAdd("d", duration, userInputDate) 
     'Put it back on the sheet 
     Cells(MyRow, "E").Value = endDate 
    End If 
    MyRow = MyRow + 1 
Wend 
End Sub 

Vielen Dank.

+1

Wann soll es erzeugt werden? Wenn es erzeugt wird, sobald das Arbeitsblatt erstellt wird, werden Sie mit vielen Zellen enden, die "1. Januar 1900" sagen. (Könntest du einfach die Formel '= C6 + D6' in die Zelle E6 setzen usw. und den Benutzern erlauben, den Wert bei Bedarf zu überschreiben, oder ist es die Absicht, dass die Benutzer" Startdatum "oder" Dauer "aktualisieren und du nicht 'Geplantes Enddatum' sollte nicht geändert werden, wenn diese Zellen ursprünglich gefüllt wurden?) – YowE3K

+0

Ich möchte, dass das Enddatum jedes Mal generiert wird, wenn das Anfangsdatum und die Dauerzelle ausgefüllt werden und wenn es möglich ist, möchte ich den Benutzer nicht den für das geplante Enddatum aufgefüllten Wert zu überschreiben. – hotseetotsee

+0

Um nur sicher zu sein, was Sie fragen, wenn ein Benutzer ein Datum vom 1. Januar 2017 in Zelle C10 eingibt und dann eine Dauer von 1000 in Zelle D10 eingibt, soll Zelle E10 auf 28. September 2019 festgelegt werden. Und dann, wenn der Benutzer erkennt, dass sie nur 100 (und nicht 1000) in Zelle D10 setzen wollte, wollen Sie, dass E10 am 28. September 2019 bleibt? – YowE3K

Antwort

1

Obwohl ich empfehle, dass Sie nur eine Formel in Spalte E verwenden (z. B. hätte E6 =IF(OR(C6="",D6=""),"",C6+D6)), das folgende Worksheet_Change Ereignis möglicherweise erfüllt, was Sie gefragt haben.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    Dim o As Integer 
    Application.EnableEvents = False 
    'Don't do anything unless something changed in columns C or D 
    If Not Intersect(Target, Columns("C:D")) Is Nothing Then 
     'Process all changed cells in columns C and D 
     For Each c In Intersect(Target, Columns("C:D")) 
      With c 
       'Ensure that we are on row 6 or later, and 
       'column E is empty, and 
       'neither column C or column D is empty 
       If .Row > 5 And _ 
        IsEmpty(Cells(.Row, "E").Value) And _ 
        Not (IsEmpty(Cells(.Row, "C").Value) Or IsEmpty(Cells(.Row, "D").Value)) Then 
        'Ensure that column C contains a date, and 
        'column D contains a numeric value 
        If IsDate(Cells(.Row, "C").Value) And _ 
         IsNumeric(Cells(.Row, "D").Value) Then 
         'Calculate planned end date 
         Cells(.Row, "E").Value = CDate(Cells(.Row, "C").Value + Cells(.Row, "D").Value) 
        End If 
       End If 
      End With 
     Next 
    End If 
    Application.EnableEvents = True 
End Sub 

Beachten Sie, dass eine Änderung an eine Zelle in Spalte C oder D wird nicht den Wert in Spalte E neu zu berechnen, wenn Sie das Bit entfernen, die IsEmpty(Cells(.Row, "E").Value) And _ sagt. (Aber, wenn Sie das tun, können Sie auch nur die Formel verwenden, die ich empfohlen habe.)

+0

Vielen Dank dafür !! Es funktioniert perfekt. Wenn ich mir Ihren Code anschaue, verstehe ich jetzt besser, wie Sie den Subcode in das Ereignis "worksheet_change" integrieren. – hotseetotsee

0

Ich halte Ihre Daten wie wie unten

ID Task Description Start Date Duration Planned End Date 
1 subtask1   5-Dec-16   5  
2 subtask2   22-Dec-16   6  
3 subtask3   1-Dec-16   33 
4 subtask4   21-Dec-16   12 
5 subtask5   4-Jan-16   6 

Setzen Sie den Code unten in Blatt Modul, in dem Sie die Funktion ausführen wollen

Private Sub Worksheet_Change(ByVal Target As Range) 

If (Target.Column = 3 Or Target.Column = 4) And Target.Row >= 2 Then 


    If Cells(Target.Row, 3) = vbNullString Or Cells(Target.Row, 4) = vbNullString Then 

    Else 
     Cells(Target.Row, 5).Value = Cells(Target.Row, 3).Value + Cells(Target.Row, 4).Value 
    End If 

End If 


End Sub 

Es erzeugt die Ausgabe jedes Mal, wenn Sie die Daten eingeben im Spaltenstartdatum oder in der Dauer.

Verwandte Themen