简单日期差异引用表单控件

Simple Date Difference Referencing Form Control

我想做一个简单的日期差异计算,return是年和月的值。我现在的代码是:

Private Sub Form_AfterUpdate() 
Dim IntegerYears As Long 
Dim IntegerMonths As Long 

IntegerYears = DateDiff("yyyy", Me.DeemedFilingDate, Now()) 
IntegerMonths = DateDiff("m", Me.DeemedFilingDate - IntegerYears, Now()) 
Me.TimeElapsedFromFilingDate = IntegerYears & " Yr(s)." & " " & "," & " " & IntegerMonths & " Mo(s)." 

End Sub

此时,我得到了 year/month 格式的输出,但它不正确。我得到负数,月份计数超过 12 个月,当开始日期在前一年但一年未必过去时,年份显示 1 年。例如,如果开始日期是 12/1/2017 而当前日期是 3/2/2018 而不是 returning 3 个月,代码将 return 1 年。

您正在做很多不寻常的事情。让我带您了解一下:

您已将 TimeElapsed 声明为双精度数,但您将其设置为等于 DateDiff 的结果,其中 returns 一个 Variant(Long)

Dim TimeElapsed As Long

您需要在 DateDiff 中为第一个参数使用字符串定界符。还有,y是小写的,不是大写的:

TimeElapsed = DateDiff("yyyy", Now(), Me.DeemedFilingDate)

这一行:

IntegerMonths = Round(TimeElapsed - IntegerYears) * 12

对我来说毫无意义。您是在计算经过的时间,去掉当时和现在之间的年差,然后四舍五入,然后乘以 12?

您可能需要以下内容:

IntegerMonths = DateDiff("m", Now(), Me.DeemedFilingDate - TimeElapsed)

此外,VBA 并不真正处理整数。 VBA 中的所有整数都是真正的长整数,根据需要转换为整数。使用 long 更有效率,而且不会占用更多内存。

最终结果:

Private Sub Form_AfterUpdate()
    Dim IntegerYears As Long
    Dim IntegerMonths As Long

    IntegerYears = DateDiff("yyyy", Now(), Me.DeemedFilingDate)
    IntegerMonths =  DateDiff("m", DateAdd("yyyy", IntegerYears *-1, Now()), Me.DeemedFilingDate)
    Me.TimeElapsedFromFilingDate = IntegerYears & " Years " & IntegerMonths & " Months"
End Sub

已解决:

Private Sub Form_AfterUpdate()
Dim TimeElapsedMonths As Integer
Dim TimeElapsedYears As Integer
Dim TimeElapsedRemMonths As Integer

TimeElapsedMonths = DateDiff("m", Me.DeemedFilingDate, Now())
TimeElapsedRemMonths = TimeElapsedMonths Mod 12
TimeElapsedYears = Int(TimeElapsedMonths / 12)

Me.TimeElapsedFromFilingDate = TimeElapsedYears & " Yr(s)." & "," & " " & 
TimeElapsedRemMonths & " Mo(s)."

End Sub