【问题标题】:Simple Date Difference Referencing Form Control简单的日期差异引用表单控件
【发布时间】:2018-08-11 06:46:36
【问题描述】:

我正在尝试进行简单的日期差异计算,返回年份和月份值。我现在的代码是:

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 年。例如,如果开始日期是 2017 年 12 月 1 日,当前日期是 2018 年 3 月 2 日,代码将返回 1 年,而不是只返回 3 个月。

【问题讨论】:

    标签: vba ms-access datediff


    【解决方案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
    

    【讨论】:

    • 我尝试使用您提供的代码,但仍然得到奇怪的结果。例如,我预计 2014 年 10 月 1 日和今天之间的差异是 4 年零 5 个月。但是,代码返回 -4 年零 -41 个月。月数不得超过 12 个月。我可以通过取绝对值来解决 (-) 问题,但这不能解决月份问题。对这个问题有什么建议吗?
    • 我做了这个调整来纠正负值,但我仍然得到一个超过 12 个月的计数: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
    • 我犯了一个简单的错误:你必须将 long 回溯到一年:
    • 这是什么意思?
    • 这部分代码出现错误:IntegerMonths = DateDiff("m", DateAdd("yyyy", Now(), IntegerYears * -1), Me.DeemedFilingDate)。这是无效的过程调用或参数错误。
    【解决方案2】:

    已解决:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      相关资源
      最近更新 更多