【问题标题】:vba excel datediff calculates different resultsvba excel datediff计算不同的结果
【发布时间】:2020-10-02 12:12:09
【问题描述】:

我正在尝试计算两次之间的时间差。

但我没有得到预期的结果,事实上相同的功能 给我带来了两种不同的结果。

14:22:00 到 22:57:48 之间的时间应为 8 小时 35 分 48 秒。 但是我得到了两个不同的数字。

如果我将值存储为日期,我会得到 14:19:12 如果我在旅​​途中在 msgbox 中计算,我会得到 8,5966...

两者都不正确,或者它使用了某种我不知道的格式。 屏幕截图显示了 msgbox 和存储测试。 也在预期结果中发布。

有什么建议吗?


Public Sub DDtest()

Dim EDay As Date
Dim ETime As Date
Dim DtgA As Date

EDay = Format(CDate(Replace(Worksheets("Data2020").Range("E2").Value, ".", "/")), "dd-mmm-yyyy")
ETime = Format(Worksheets("Data2020").Range("F2"), "hh:mm:ss")
DtgA = EDay + ETime

Dim EDay2 As Date
Dim ETime2 As Date
Dim DtgB As Date

EDay2 = Format(CDate(Replace(Worksheets("Data2020").Range("E3").Value, ".", "/")), "dd-mmm-yyyy")
ETime2 = Format(Worksheets("Data2020").Range("F3"), "hh:mm:ss")
DtgB = EDay2 + ETime2

Dim result As Date
result = Format(DateDiff("s", DtgA, DtgB) / (60 * 60), "hh:mm:ss")

MsgBox "Date 1:" & DtgA & vbNewLine & "Date 2:" & DtgB & vbNewLine & vbNewLine & DateDiff("s", DtgA, DtgB) / (60 * 60) & vbNewLine & result


End Sub

【问题讨论】:

  • 请永远不要将您的代码发布为图像。编辑您的问题并复制/粘贴您的代码。
  • 添加到@FoxfireAndBurnsAndBurns cmets,E2, F2, E3,F3 范围内的值是多少?
  • 已添加代码.. E 列只是日期,即在本例中为 12.12.2019,然后我替换为 -,因为它不适用于 .作为分隔符,转换为日期和格式。 F列,是时间..
  • 但问题是为什么 DateDiff 使用相同的数字给出两个不同的结果。
  • 8.5966 小时似乎与您正在寻找的答案有关。由于日期以数字形式存储,整数表示从 1900 年 1 月 1 日开始的天数,小数部分是一天的一部分,因此一天的 0.5966 部分(格式化为时间)在下午 2 点之后为您提供。跨度>

标签: excel vba


【解决方案1】:

DateDiff("s", DtgA, DtgB) / (60 * 60) 将返回 十进制 值,在本例中为 8.59666666666667 小时

当您应用Format 将其转换为hh:mm:ss 时,值8.59666666666667 被视为小时。 Excel 认为这是一个必须转换为日期的十进制值,并被视为 days

在 Excel 中,日期始终是数字。整数部分是日期本身,而小数部分是时间,是当天的一部分,但不是当天本身。

Excel 可以使用的第一天是 01/01/1900,数值是 1,2 是 02/01/1900,依此类推。

所以 Excel 认为 8.5966666666666708/01/1900 14:19:12

如果你将这些小时除以 24,你会得到正确的结果:

result = Format(DateDiff("s", DtgA, DtgB) / (60 * 60) / 24, "hh:mm:ss")

你明白了:

注意第一个值是十进制值,第二个格式为hh:mm:ss。但它们都显示相同的值,但格式不同。

更新:实际上,如果您强制日期值相差 8 个半小时,您将完美地看到 Excel 的工作原理。值相同,但格式不同。

我已将日期强制设置为 12/12/2019 14:22:0012/12/2019 22:52:00,我明白了:

正好是 8 个半小时,但第一个是十进制,第二个是格式 hh:mm:ss

【讨论】:

  • 我摘下帽子……先生,您是冠军。感谢您花时间解释更改以及如何使其发挥作用。真的很感激。
【解决方案2】:

为什么要在计算前格式化?如果单元格值是日期格式不计。

日期和时间 = 441040.598611111111111

Sub calcDatediff()
    date1 = Worksheets("masterdata").Range("C11")
    time1 = Worksheets("masterdata").Range("D11")
    date2 = Worksheets("masterdata").Range("C12")
    time2 = Worksheets("masterdata").Range("D12")

    dtime1 = date1 + time1
    dtime2 = date2 + time2
    difftime = Format(dtime2 - dtime1, "HH:mm:ss", vbMonday, vbFirstFourDays)
End Sub

【讨论】:

  • 这触及了核心问题,就是答案。
  • 这不是我的表,而且是一团糟,其中有混合字段、混合分隔符、清理和创建新表以供使用。 :( 这就是格式化的原因。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多