简单日期差异引用表单控件
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
我想做一个简单的日期差异计算,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