Excel VBA可以计算月份,date和月份吗?

我试图用Datediff函数一起计算总的月数,天数和小时数。 这不可能吗?

DateDiff("d hh", datein, Now) 

我能做什么?

这是不可能的,因为interval参数只能是单个string。

你将不得不做更多的工作,比如得到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 

这是粗糙和准备,但只是方向性的。 你可以做一个用户定义的function。 这个返回1:2:22:15作为一个string(但你可以返回一个自定义的类实例variables为几个月,几天,几小时,几分钟)。 它没有考虑date1之前的date1(不知道会发生什么),也不考虑date1只是一个部分date(假设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这个:

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

得到:

1:2:22:15

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

通过将组件添加回date1来反向testing:

?使用DateAdd( “n” 个,15个,使用DateAdd( “H”,22,使用DateAdd( “d”,2,使用DateAdd( “M”,1 “01-SEP-2014”))))

=“03-Oct-2014 22:15:33”

如果我们尝试在同一个月份的两个date:

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

我们得到:

0:2:22:15

反向testing:

?使用DateAdd( “n” 个,15个,使用DateAdd( “H”,22,使用DateAdd( “d”,2,使用DateAdd( “M”,0, “01-SEP-2014”))))

得到:

03/09/2014 22:15:00

但是,你可能想要说明date是错误的……如果date晚些时候开始,你可能只希望date1被视为一个部分date……正如我所说,只是一个想法。

问候

一世

这可能会给你一些想法来纠正一个月的日子或闰年二月

 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