使用VBA计算基于频率的到期date

所以,现在我有这个Excel表, 最后修订date。 我已经命名这个专栏“LastRevisionDate”。 然后我有一个名为“RevisionFrequency”的列。 “RevisionFrequency”包含一个下拉菜单(数据validation),包括术语“ Annually ,“ Semi-Annually ”和“ Quarterly 。 然后我有一个专栏说明“NextRevisionDate”。

所以我想写一些VBA代码来计算LastRevisionDateRevisionFrequency中NextRevisionDate

例如。 在列“A”中,我的修订频率Semi-Annually一次,而最后一次修订date是“B”列中的Mar-14 ,那么我希望NextRevisionDate在列“C”中表示9月份 。 这基本上是说这个项目每年修改两次。

所以我想创build一个macros,其中列“C”是基于RevisionFrequencyLastRevisionDate 。 我意识到我可以用一个公式来做到这一点,但我有新的项目不断添加,所以我不想保持复制公式到每个单元格。 还有一些项目,他们不需要修订,我也想有一个空白的单元格,如果没有LastRevisionDate

到目前为止,我有这样的代码:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Set ws = Sheets(1) 'For this reference of the Column Named LastCalDate I am getting an error If Not Intersect(Target, ws.Range("LastCalDate").Value) Is Nothing Then Dim Lastdate As Date Dim DueDate As Variant Dim Frequency As String Dim R As Variant Dim C As Variant Dim R1 As Variant Dim C1 As Variant Dim R2 As Variant Dim C2 As Variant R = Range("LastCalDate").Row C = Range("LastCalDate").Column R1 = Range("CalDueDate").Row C1 = Range("CalDueDate").Column R2 = Range("CalFrequency").Row C2 = Range("CalFrequency").Column Lastdate = Cells(R, C).Value 'Last Cal Date DueDate = Cells(R1, C1).Value 'Cal Due Date Frequency = Cells(R2, C2) If Frequency = "Annually" Then DueDate = DateAdd("mmm", 12, Lastdate) End If If Frequency = "Semi-Annually" Then DueDate = DateAdd("mmm", 6, Lastdate) End If If Frequency = "Quarterly" Then DueDate = DateAdd("mmm", 3, Lastdate) End If End Sub 

这是我迄今为止。 我不确定如果我正确地做到这一点?

使用Worksheet_Change方法是创build新单元格值而不必复制和粘贴公式的好方法。 我在我的代码中也包含了支票,以确定date或频率是否未设置,然后将值清除。

 Private Sub Worksheet_Change(ByVal Target As Range) ' declare and set worksheet Dim ws As Worksheet Set ws = Sheets(1) ' declare and set default date Dim DefaultDueDate As Date ' declare needed variables Dim StartDate As Date Dim Frequency As String Dim DueDate As Date ' make sure the change only occured on the "A" or "B" column If Target.Column = 1 Or Target.Column = 2 Then StartDate = ws.Range("A" & Target.Row) Frequency = ws.Range("B" & Target.Row) ' if start date does not equal the default due date and the frequency is not blank, set due date variable If StartDate <> DefaultDueDate And Frequency <> "" Then ' add months to the provided start date If Frequency = "Annually" Then DueDate = DateAdd("m", 12, StartDate) ElseIf Frequency = "Semi-Annually" Then DueDate = DateAdd("m", 6, StartDate) ElseIf Frequency = "Quarterly" Then DueDate = DateAdd("m", 3, StartDate) End If ' Make sure frequency selection is correct and due date was set If DueDate <> DefaultDueDate Then ws.Range("C" & Target.Row) = DueDate End If Else ' clear Next Revision Date when Frequency or Start Date is blank ws.Range("C" & Target.Row) = "" End If End If End Sub