Excel VBA datediff一起计算月,日和月?

时间:2014-10-15 08:37:51

标签: excel excel-vba vba

我尝试使用Datediff功能计算总月数,天数和小时数所用的时间。这不可能吗?

DateDiff("d hh", datein, Now)

我该怎么办?

3 个答案:

答案 0 :(得分:6)

这是不可能的,因为interval parameter只能是一个字符串。

你需要做更多的工作,比如在hours中获得差异,如果它超过24,则将小数分隔符之前的部分转换为天数

Sub Main()

    Dim d1 As Date
    d1 = "15/10/2014 08:00:03"

    Dim d2 As Date
    d2 = Now

    Dim hrsDiff As Long
    hrsDiff = DateDiff("h", d1, d2)

    MsgBox IIf(hrsDiff >= 24, _
               hrsDiff \ 24 & " days " & hrsDiff Mod 24 & " hours", _
               hrsDiff & " hours")

End Sub

答案 1 :(得分:3)

这很粗糙,准备就绪,但只是方向性的。您可以创建用户定义的函数。这个以字符串形式返回1:2:22:15(但您可以返回包含月,日,小时,分钟变量的自定义类实例)。它没有考虑date2在date1之前(不确定会发生什么),也不考虑date1只是部分日(假设date1是午夜)。

Function MyDateDiff(date1 As Date, date2 As Date) As String
    Dim intMonths As Integer
    Dim datStartOfLastMonth As Date
    Dim datStartOfLastHour As Date
    Dim datEndOfMonth As Date
    Dim intDays As Integer
    Dim intHours As Integer
    Dim intMinutes As Integer
    Dim strResult As String
    ' Strip of any time
    datStartOfLastMonth = DateSerial(Year(date2), Month(date2), Day(date2))

    ' check the dates arent in the same month
    If Not ((Month(date1) = Month(date2) And Year(date1) = Year(date2))) Then

        ' how many months are there
        intMonths = DateDiff("m", date1, date2)
        Debug.Print (intMonths)

        ' how many days difference are there
        intDays = DateDiff("d", DateAdd("m", intMonths, date1), date2)
        Debug.Print (intDays)

        ' how many hours difference are there
        intHours = DateDiff("h", datStartOfLastMonth, date2)
        Debug.Print (intHours)

        ' how many minutes different are there
        datStartOfLastHour = datStartOfLastMonth + (DatePart("h", date2) / 24)
        intMinutes = DateDiff("n", datStartOfLastHour, date2)
        Debug.Print (intMinutes)
    Else
        ' Dates are in the same month
        intMonths = 0
        Debug.Print (intMonths)

        ' how many days difference are there
        intDays = DateDiff("d", date1, date2)
        Debug.Print (intDays)

        ' how many hours difference are there
        intHours = DateDiff("h", datStartOfLastMonth, date2)
        Debug.Print (intHours)

        ' how many minutes different are there
        datStartOfLastHour = datStartOfLastMonth + (DatePart("h", date2) / 24)
        intMinutes = DateDiff("n", datStartOfLastHour, date2)
        Debug.Print (intMinutes)
    End If

     strResult = intMonths & ":" & intDays & ":" & intHours & ":" & intMinutes
     MyDateDiff = strResult
End Function

测试:

?MyDateDiff(" 01-SEP-2014"," 03-Oct-2014 22:15:33")

给出:

1:2:22:15

即。 1个月,2天,22分15秒。

通过将组件添加回date1来反向测试这个:

使用DateAdd(" N" 15,使用DateAdd(" H" 22,使用DateAdd(" d",2,使用DateAdd(" M& #34;,1," 01-SEP-2014"))))

=" 03-Oct-2014 22:15:33"

如果我们在同一个月尝试2个日期:

?MyDateDiff(" 01-SEP-2014"," 03-SEP-2014 22:15:33")

我们得到:

0:2:22:15

反向测试:

使用DateAdd(" N" 15,使用DateAdd(" H" 22,使用DateAdd(" d",2,使用DateAdd(" M& #34;,0," 01-SEP-2014"))))

给出:

03/09/2014 22:15:00

但是你可能想要考虑日期是错误的方式...并且你可能只想将date1计算为部分日期,如果它在当天晚些时候开始....正如我所说,只是一个想法

此致

答案 2 :(得分:-1)

这可能会给你一些想法来纠正2月或闰年的天数

Private Sub CommandButton1_Click()
    DoDateA
End Sub

Sub DoDateA()
    Dim D1 As Date, D2 As Date, DC As Date, DS As Date
    Dim CA: CA = Array("", "yyyy", "m", "d", "h", "n", "s", "s")
    Dim Va%(7), Da(7) As Date, Ci%
    D1 = Now + Rnd() * 420  ' vary the  * factors for range of dates
    D2 = Now + Rnd() * 156
    If D1 > D2 Then
        [b4] = "Larger"
    Else
        [b4] = " smaller"
        DS = D1
        D1 = D2
        D2 = DS
    End If
    [d4] = D1
    [e4] = D2
    DC = D2
    For Ci = 1 To 6
        Va(Ci) = DateDiff(CA(Ci), DC, D1)
        DC = DateAdd(CA(Ci), Va(Ci), DC)
        Va(Ci + 1) = DateDiff(CA(Ci + 1), DC, D1)
        If Va(Ci + 1) < 0 Then  ' added too much
            Va(Ci) = Va(Ci) - 1
            DC = DateAdd(CA(Ci), -1, DC)
            Cells(9, Ci + 3) = Va(Ci + 1)
            Cells(8, Ci + 3) = Format(DC, "yyyy:mm:dd hh:mm:ss")
        End If
        Da(Ci) = DC
        Cells(5, Ci + 3) = CA(Ci)
        Cells(6, Ci + 3) = Va(Ci)
        Cells(7, Ci + 3) = Format(Da(Ci), "yyyy:mm:dd hh:mm:ss")
        Cells(10, Ci + 3) = DateDiff(CA(Ci), D2, D1)
    Next Ci
End Sub