【问题标题】:How to count the number of Years between two dates如何计算两个日期之间的年数
【发布时间】:2018-03-04 10:14:16
【问题描述】:

此宏计算工作经历的第一个日期和最后一个日期之间的年数。我完成了这项工作,但是以一种奇怪的格式获得了这个数字(就像一个日期而不是一个数字)。看起来可能有什么问题。 在此先感谢您的 cmets。

Sub CuentaExperiencia()
Worksheets("Candidatos").Activate
'esta macro contabiliza los años de experiencia sumados

Range("T2").Select
Do Until ActiveCell.Offset(0, -18).Value = ""
    If ActiveCell.Value = "" Then
    ActiveCell.FormulaR1C1 = DateDiff("d", (ActiveCell.Offset(0, -2)), (ActiveCell.Offset(0, -1)))
    End If
    ActiveCell.Offset(1, 0).Select
Loop

Range("AE2").Select
Do Until ActiveCell.Offset(0, -29).Value = ""
    If ActiveCell.Value = "" Then
    ActiveCell.FormulaR1C1 = DateDiff("d", (ActiveCell.Offset(0, -2)), (ActiveCell.Offset(0, -1)))
    End If
    ActiveCell.Offset(1, 0).Select
Loop

Range("AP2").Select
Do Until ActiveCell.Offset(0, -40).Value = ""
    If ActiveCell.Value = "" Then
    ActiveCell.FormulaR1C1 = DateDiff("d", (ActiveCell.Offset(0, -2)), (ActiveCell.Offset(0, -1)))
    End If
    ActiveCell.Offset(1, 0).Select
Loop

Range("BA2").Select
Do Until ActiveCell.Offset(0, -51).Value = ""
    If ActiveCell.Value = "" Then
    ActiveCell.FormulaR1C1 = DateDiff("d", (ActiveCell.Offset(0, -2)), (ActiveCell.Offset(0, -1)))
    End If
    ActiveCell.Offset(1, 0).Select
Loop


End Sub

【问题讨论】:

  • 将单元格格式改为General
  • 此外,您还返回 "d" 的日子,将其更改为 "y" 多年。
  • 将此数字粘贴到单元格43000.8067708333,然后将单元格格式更改为date,然后将单元格格式更改为time ...日期和时间实际上存储为数字。 .... 整数部分 (43000) 是日期。小数部分是一天中的时间
  • 您也可以在表格中使用 DATEDIF 公式:support.office.com/en-us/article/…

标签: excel vba date time offset


【解决方案1】:

只要用=DAYS(end_date,start_date)公式,然后除以365就可以得到年数;无需使用 VBA。如果您将其作为较大 VBA 宏的一部分,您可以使用 WorksheetFunction.Days(end_date,start_date)

编辑:更简单:只需使用=YEARFRAC()。它会为你做这一切。

您应该注意,简单地除以 365 不考虑闰年,这会在答案中引入一些错误。虽然在这种情况下这个错误是微不足道的,但您可以通过使用=YEARFRAC(start_date, end_date, [basis]) 并使用1 作为基本参数来避免它。这将强制使用实际日历日,这将正确解释闰年。否则,YEARFRAC 会假定每个月有一个标准的 30 天月份,您的答案将越来越不准确。

【讨论】:

  • 由于闰日(2 月 29 日),除以 365 会得出不准确的结果
  • 离开1/365 一年对于确定工作经验年限没有影响。
  • (a) 它是=DAYS(end_date,start_date)(即你的参数是从前到后的) (b) 如果你要麻烦地使用 DAYS 函数(而不是仅仅计算 =end_date-start_date)那么你显然担心两个参数的时间部分对结果的影响,因此这意味着在除数中使用365(甚至365.2425)可能会导致问题。
  • @Chilangosta,如果你从 3 月 1 日开始,再加上 365 天,那么你大部分时间可以在 3 月 1 日降落,但你也可以在 2 月 29 日降落。如果您计算整个日历年,那么在 25% 的时间里相差一年……为 =YEARFRAC() 投票。
  • Re (b) 是的,Excel 在猜测要应用哪种单元格格式时有时不是很智能。当它识别出公式减去两个日期时,它通常假定它正在返回一个数字并将其格式化为General。因此,例如,=TODAY()-DATE(2015,1,1)(即使用日期而不是字符串作为减去的值)显示 995。=A1-B1 也是如此,其中两个单元格都被格式化为日期。但是=TODAY()-A1 会将结果显示为日期,尽管这两个值都可以识别为日期。奇怪的 Excel。愚蠢的Excel。 (但我们仍然喜欢它。)
【解决方案2】:

或者你可以像这样使用 Datediff 函数...

DateDiff("yyyy", StartDate, EndDate)

示例代码:

Sub NumberOfYears()
Dim StartDate As Date
Dim EndDate As Date
Dim Years As Integer

StartDate = #1/1/2015#
EndDate = #12/31/2017#

Years = DateDiff("yyyy", StartDate, EndDate)
MsgBox Years
End Sub

【讨论】:

  • VBA DateDiff with "yyyy" 不能用于计算两个日期之间的 365 天差数!示例:当比较 12 月 31 日和下一年的 1 月 1 日时,即使只过去了一天,它也会返回 1,确认 Microsoft
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2022-01-14
  • 2021-07-08
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多