Excel ETA计算器。 随着转折

使用Excel,我试图计算从出发date和时间字段以及距离字段计算的预计到达时间(ETA)。 速度是艰难的部分,因为它取决于一天中的时间而变化。

现在,让我们假设根据一天中的小时只有两种速度可能性。 在上午8点到晚上7点之间,速度等于16.晚上7点到早上8点,速度等于8.实际的数字可能会大不相同,所以不要假设夜间速度是半速。

我想在一个date和时间下降,并有公式计算ETA利用的距离和适当的速度根据一天中的时间。

例如,从1月1日下午6点开始的500英里行程将导致1Hr @ 16,13Hr @ 8,11Hr @ 16,13Hr @ 8,6.25Hr @ 16。 1月3日下午2点15分到达,共计44.25小时

date加44.25小时是愚蠢的简单,但是,计算在一定的时间内开始时间和速度可能的时间已经躲过了我。

哇,你付出了很多努力,我真的很感谢这个努力。 但是,它并没有做我想做的事情。

我试图把起始date和时间,以及到目的地的距离作为input。 然后它必须使用白天变化的速度来计算ETA。 平均值将不会完成。 每次旅行都有一个精确的ETA,根据开始时间的不同,固定距离的旅行时间也会有很大差异。

我花了一段时间,但我做了你需要的function。 date需要格式化为“2011/01/01 18:00”(确保您正在阅读的date的单元格types和函数结果单元格的types是date)。 您可以轻松地在代码中更改速度1和2的值,以满足您的需求。

Function ETA(ByVal myTime As Date, _ ByVal distance As Double) As Date Application.ScreenUpdating = False Dim startTime As Date Dim minCounter As Double Dim result As Date Dim milesTraveled As Double ' add the first hour myTime = DateAdd("h", 1, myTime) While distance - milesTraveled >= 16 If Hour(myTime) >= 8 And Hour(myTime) <= 19 Then milesTraveled = milesTraveled + 16 Else milesTraveled = milesTraveled + 8 End If ' increment the time by 1 hour myTime = DateAdd("h", 1, myTime) Wend ' check if any miles left to go (less than 1 hour's worth) ' and calculate minutes based on speed value If distance - milesTraveled <> 0 Then ' ugly error checking to make sure that this isn't the ' last hour in the 8 speed period to avoid erroneous ' results. You can fix this up to be cleaner. If distance - milesTravel >= 8 And Hour(myTime) = 7 Then myTime = DateAdd("h", 1, myTime) milesTraveled = milesTraveled + 8 minCounter = ((distance - milesTraveled) / 16) * 60 Else If Hour(myTime) >= 8 And Hour(myTime) <= 19 Then minCounter = ((distance - milesTraveled) / 16) * 60 Else minCounter = ((distance - milesTraveled) / 8) * 60 End If End If End If ' Add left over minutes result = DateAdd("n", minCounter, myTime) ETA = result Application.ScreenUpdating = True End Function 

我testing了代码,并通过它= ETA(cellwithdate,500)和2011/01/01 18:00作为cellwithdate中的值,并将结果正确返回为2011/01/03 14:15。

它是如何工作的:我检查以确保有一整小时的旅行里程(距离 – 行驶里程是16或更多)。 然后在那一小时,我检查它是否在范围1(上午8点和下午7点),如果是,那么行驶里程是16,如果不是,那么是8。然后我加1到小时。 当剩余的时间less于1小时的时候,我计算分钟数。 你可以在这个工作,并使代码更清洁,以便更快/错误检查被添加,但是这个函数应该告诉你一个方法来做你想做的事情。

您可以使用用户定义的函数并修改以下代码:

 Option Explicit Public Function ETA(dStart As Date, dEnd As Date) As Date Dim lAvg As Double Dim iNumDays As Integer, iHours As Integer Dim lSpeed As Long Dim dTemp As Date Dim dFinal As Date 'Get average speed for each full day lAvg = Application.Average(Range("Speed")) 'Get the number of full days iNumDays = CInt(dEnd - dStart) 'Add the days dFinal = iNumDays * lAvg 'Parse every hour from start to midnight 'if end date is midnight, need to correct the loop If Hour(dEnd) = 0 Then iHours = 24 Else iHours = Hour(dEnd) End If dTemp = dStart Do While TimeValue(dTemp) <> "00:00:00" And Hour(dTemp) < iHours lSpeed = Application.VLookup(Format(dTemp, "hh:mm AM/PM"), Range("TimeSpeed"), 2, False) dFinal = DateAdd("h", lSpeed, dFinal) 'parse another hour dTemp = DateAdd("h", 1, dTemp) Loop 'Do not count the hour twice ' Check if first date and last date aren't on the same day ' or start time is midnight If Day(dStart) <> Day(dEnd) Or TimeValue(dStart) = "00:00:00" Then 'Parse every hour from midnight to end dTemp = dEnd Do While TimeValue(dTemp) <> "00:00:00" And Hour(dTemp) > Hour(dStart) lSpeed = Application.VLookup(Format(dTemp, "hh:mm AM/PM"), Range("TimeSpeed"), 2, False) dFinal = DateAdd("h", lSpeed, dFinal) 'parse another hour (step backward) dTemp = DateAdd("h", -1, dTemp) Loop End If ETA = dFinal End Function 

你将不得不使用命名的范围 :

  • TimeSpeed的范围是: A2:B25
  • Speed是范围B2:B25

我在这里上传了一个示例文件

如果有人有更好的想法来解决这个问题,欢迎您!