【问题标题】:Where is the error I am missing?我错过的错误在哪里?
【发布时间】:2025-12-21 17:55:16
【问题描述】:

如果出生日期尚未在当年被击中,则此 Sub 将无法正确计算。如果出生日期是 1950 年 12 月 31 日,它将计算出生日期为 56,但在 12 月 31 日之前,这个人实际上是 55 岁。有没有我可以添加的更新来适应这个。

Sub EE_DatedIf_ButtonC_()

    Dim wb1 As Workbook
    Dim i As Long
    Dim LastRow1 As Long
    Dim yrDiff As Long
    Dim d1 As Date
    Dim d2 As Date

    Set wb1 = Workbooks("macro all client v.01.xlsm")

    LastRow1 = wb1.Sheets("Carrier").range("F:F").Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

    For i = 10 To LastRow1

        d1 = wb1.Sheets("Carrier").Cells(8, 1)

        d2 = wb1.Sheets("Carrier").Cells(i, 24)

        yrDiff = DateDiff("yyyy", d2, d1)

        wb1.Sheets("Carrier").Cells(i, 3) = yrDiff

    Next i

End Sub

【问题讨论】:

    标签: excel date-difference vba


    【解决方案1】:

    如果你把月差数除以 12 并截断会怎样

    yrDiff = CInt(DateDiff("m", d2, d1) / 12)
    

    或者更准确地说,用小时做同样的事情

    yrDiff = CInt(DateDiff("h", d2, d1) / 8766)
    

    更新 CInt 将舍入,而不是截断。在此处使用此功能

    Public Function Trunc(ByVal value As Double, ByVal num As Integer) As Double
        Trunc = Int(value * (10 ^ num)) / (10 ^ num)
    End Function
    

    这样称呼它

    yrDiff = Trunc(DateDiff("h", d2, d1) / 8766, 0)
    

    【讨论】:

    • @TTT 我将把它包含在我的答案中。谢谢。
    • 不错的闰年调整。 :)
    • 我已将此更新添加到 Sub,但仍无法正确计算年龄。它说从 1991 年 4 月 18 日到 2016 年 1 月 1 日的年龄是 25 岁,但我预计是 24 岁。
    • yrDiff = CInt(DateDiff("d", d2, d1) / 365) wb1.Sheets("Carrier").Cells(i, 3) = yrDiff Next i
    • 显然CInt 可以舍入,而不是截断。我找到了一个方便的截断函数here,它可以工作。我正在更新我的答案以使用它。
    【解决方案2】:

    如果您比较同一月/日以确定该日期是否已过,您将得到 True 或 False。在 VBA 中 True 为 -1,False 为 0,因此您可以在日期已过时简单地添加(通过减去)

    Sub test()
    
        Dim d1 As Date, d2 As Date
        Dim yrDiff As Long
    
        d2 = #5/31/1950#
        d1 = #6/30/2016#
    
        yrDiff = Year(d1) - Year(d2) + CLng(d1 < DateSerial(Year(d1), Month(d2), Day(d2)))
        Debug.Print yrDiff
    
        d2 = #7/31/1950#
    
        yrDiff = Year(d1) - Year(d2) + CLng(d1 < DateSerial(Year(d1), Month(d2), Day(d2)))
        Debug.Print yrDiff
    
    End Sub
    

    【讨论】: