我正在尝试进行简单的日期差异计算,该计算返回“年”和“月”值。我现在的代码是:
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
此时,我以年/月格式获得输出,但这不正确。我得到负数,月份数超过12个月,年份显示1年,开始日期是前一年,但一年不一定过去。例如,如果开始日期是12/1/2017并且当前日期是3/2/2018而不是仅返回3个月,则代码将返回1年。
你做了很多不同寻常的事情。让我带你走过它们:
您已将TimeElapsed
声明为double,但您将其设置为等于DateDiff
的结果,后者返回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