【问题标题】:Why Is My DateDiff Returning 0?为什么我的 DateDiff 返回 0?
【发布时间】:2017-07-04 05:32:19
【问题描述】:

A 列是开始日期

B 列是 EndDate

当我运行宏时,它会返回我所有日期的答案 1,因为我将 1 添加到我的 DateDiff,那么 DateDiff 必须为 0。

我的DateDiff 有什么问题?

Sub CalculateDays()
    Dim LastRow As Long
    Dim StartDate As Date
    Dim EndDate As Date
    Dim Days As Single

    With Worksheets("Sheet1")
        'Determine last Row in Column A
         LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
         'Calculate Difference between Start Date And End Date in Days
         For i = 2 To LastRow
             StartDate = .Cells(i, 1)
             EndDate = .Cells(i, 2)
             Days = DateDiff("d", StartDate, EndDate)
             .Cells(i, 3) = Days + 1
             Days = 0
         Next i
     End With

 End Sub

样本数据:

Start Date |    End Date  
=========================
13-Feb-17  |    28-Feb-17 
14-Feb-17  |    28-Feb-17 
02-Mar-17  |    04-Mar-17 
13-Feb-17  |    15-Feb-17 
13-Feb-17  |    13-Feb-17 
15-Jan-17  |    15-Feb-17 
01-Feb-17  |    12-Feb-17 

【问题讨论】:

  • 你能发布一些你正在使用的开始和结束日期吗?有代表性的样本将有助于确定您的问题。
  • 开始日期 |结束日期 | 17 年 2 月 13 日 | 17 年 2 月 28 日 | 17 年 2 月 14 日 | 2017 年 2 月 28 日| 2017 年 3 月 2 日 | 2017 年 3 月 4 日| 17 年 2 月 13 日 | 2017 年 2 月 15 日| 13-Feb-17 13-Feb-17 15-Jan-17 15-Feb-17 01-Feb-17 12-Feb-17
  • 它们所在的单元格是什么格式的?
  • 为什么甚至需要一个函数/过程?
  • 你为什么有Dim Days As Single

标签: vba excel datediff


【解决方案1】:

您的代码实际上对我来说运行良好 - 但我确定 A 列和 B 列中的值实际上是日期。如果您不确定,请使用CDate 函数确保单元格中的值在传递给DateDiff 函数之前转换为日期,例如

StartDate = CDate(.Cells(i, 1).Value)

您添加的代码:

Option Explicit

Sub CalculateDays()
    Dim LastRow As Long
    Dim StartDate As Date
    Dim EndDate As Date
    Dim Days As Single
    Dim i As Long

    With Worksheets("Sheet1")
        'Determine last Row in Column A
         LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
         'Calculate Difference between Start Date And End Date in Days
         For i = 2 To LastRow
             StartDate = CDate(.Cells(i, 1).Value)
             EndDate = CDate(.Cells(i, 2).Value)
             Days = DateDiff("d", StartDate, EndDate)
             .Cells(i, 3) = Days + 1
             Days = 0
         Next i
     End With

 End Sub

编辑

我刚刚阅读了this,它指出了南非日期格式的问题:

.. 我的地区是“英语(南非)”),日期分隔符为“/”,但 Excel 不断将其更改为“-”。 ...

因此,也许值得检查您的区域设置,并可能将您的日期重新格式化为 dd/mmm/yyyy 而不是 dd-mmm-yyyy 并检查输出。

也许CDATE 函数毕竟不是必需的(正如我提到的,您的代码在澳大利亚英语区域设置环境中对我来说运行良好)。

【讨论】:

  • 同样使用 cdate 方法,您可能希望检查错误并进行处理,因为 31/02/2017 的文本会导致 cdate 失败。
  • 嗨罗宾麦肯齐。谢谢你的建议。我尝试以相同的结果运行您的代码。我正在使用 Excel For Mac 2011。
  • 你知道,我试过CDate("13-Feb-17"),它给出了一个类型不匹配的错误!
  • @RobinMackenzie:该死的!确实可怕区域设置也会影响CDate..."13-Fev-17" 是错误但"13-Fév-17" 很容易通过...我讨厌这些区域设置!
  • @R3uK - 是的 - 完全痛苦。如果只有正确的世界语,一切都会变得更容易;)?
【解决方案2】:

或者,写一个公式而不是一个函数:

=ROUND(B2-A2+1,0)

【讨论】:

    【解决方案3】:

    为什么需要 datediff 函数。获取天差使用

    days=enddays - 开始日期

    您的代码在寡妇的 excel 2016 中运行良好。正如@RobinMackenzie 所提到的,您在区域日期设置方面存在一些问题。

    【讨论】:

    • 我是 VBA 的新手,我决定弄清楚 DateDiff 是如何工作的,但它对我不起作用!
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2022-01-23
    相关资源
    最近更新 更多