[英]Excel VBA datediff to Calculate Months, Days and Month together?
I'm trying to calculate the time elapsed with the total amount of months, Days and Hours together using Datediff function. 我正在尝试使用Datediff函数计算总月数,天数和小时数所用的时间。 Is it not possible?
这不可能吗?
DateDiff("d hh", datein, Now)
What can I do? 我能做什么?
That's not possible as the interval parameter can only be a single string. 这是不可能的,因为interval参数只能是一个字符串。
You will have to do a bit more work like get the difference in hours
and if it's above 24 convert the part before decimal separator into days 你需要做更多的工作,比如获得
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
This is rough and ready, but is just directional. 这很粗糙,准备就绪,但只是方向性的。 You could make a user defined function.
您可以创建用户定义的函数。 This one returns 1:2:22:15 as a string (but you could return a custom class instance with variables for months, days, hours, minutes).
这个以字符串形式返回1:2:22:15(但您可以返回包含月,日,小时,分钟变量的自定义类实例)。 It doesn't account for date2 being before date1 (not sure what happens then), nor does it account for date1 only being a partial day (assumes date1 is midnight).
它不考虑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
Testing this: 测试这个:
?MyDateDiff("01-SEP-2014", "03-Oct-2014 22:15:33") ?MyDateDiff(“01-SEP-2014”,“03-Oct-2014 22:15:33”)
Gives: 得到:
1:2:22:15 1:2:22:15
ie 1 month, 2 days, 22 minutes and 15 seconds. 即1个月,2天,22分15秒。
Reverse testing this by adding the components back onto date1 gives: 通过将组件添加回date1来反向测试它给出:
?DateAdd("n",15,DateAdd("h",22,DateAdd("d",2,DateAdd("m",1,"01-SEP-2014")))) ?使用DateAdd( “n” 个,15个,使用DateAdd( “H”,22,使用DateAdd( “d”,2,使用DateAdd( “M”,1 “01-SEP-2014”))))
= "03-Oct-2014 22:15:33" =“03-Oct-2014 22:15:33”
If we try with 2 dates in the same month: 如果我们在同一个月尝试2个日期:
?MyDateDiff("01-SEP-2014", "03-SEP-2014 22:15:33") ?MyDateDiff(“01-SEP-2014”,“03-SEP-2014 22:15:33”)
We get: 我们得到:
0:2:22:15 0:2:22:15
Reverse testing this: 反向测试:
?DateAdd("n",15,DateAdd("h",22,DateAdd("d",2,DateAdd("m",0,"01-SEP-2014")))) ?使用DateAdd( “n” 个,15个,使用DateAdd( “H”,22,使用DateAdd( “d”,2,使用DateAdd( “M”,0, “01-SEP-2014”))))
Gives: 得到:
03/09/2014 22:15:00 03/09/2014 22:15:00
But you may want to account for dates being the wrong way round...and you may only want date1 to be counted as a partial date if it starts later in the day....as I say, just a thought. 但是你可能想要考虑日期是错误的方式...你可能只想将date1计算为部分日期,如果它在当天晚些时候开始......正如我所说,只是一个想法。
Regards 问候
i 一世
This may give you some ideas to correct for days in month or leap year Feb 这可能会给你一些想法来纠正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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.