【问题标题】:Compare dates with specific datetime format (VBA)将日期与特定日期时间格式 (VBA) 进行比较
【发布时间】:2017-05-30 10:36:02
【问题描述】:

编辑:根据答案,我能够从一个范围内获得最小/最大日期:

Dim dt As Date
dt = WorksheetFunction.Min(Range("D2:D300"))

但这还不够。如何将此函数与数组而不是范围一起使用?

原帖: 我有以下列:

格式为:DD/MM/YYYY HH:MM

我试图从第一列获取最快的日期时间,从第二列获取最新的日期时间。在这种情况下:

2017 年 2 月 1 日 6:07(第一栏最早的日期时间,1 月 2 日)

02/02/2017 14:11(第二列的最新日期时间,2 月 2 日)

我有一个包含单元格值的多维数组 (myData),我的函数是这些:

Private Function GetLatestDateFromData() As String
  Dim latestDate As String
  Dim i As Long

  latestDate = myData(1, ColumnsIndex(3) - 1)

  For i = 1 To UBound(myData, 1) - 1
      If latestDate < myData(i, ColumnsIndex(3) - 1) Then
          latestDate = myData(i, ColumnsIndex(3) - 1)
      End If
  Next
  GetLatestDateFromData = latestDate
End Function

Private Function GetEarliestDateFromData() As String
  Dim earliestDate As String
  Dim i As Long

  earliestDate = myData(1, ColumnsIndex(2) - 1)

  For i = 1 To UBound(myData, 1) - 1
      If earliestDate > myData(i, ColumnsIndex(2) - 1) Then
          earliestDate = myData(i, ColumnsIndex(2) - 1)
      End If
  Next

  GetEarliestDateFromData = earliestDate
End Function

问题是我的结果如下:

startingFrom = DateValue(GetEarliestDateFromData) 'returns 01/02/2017, 1st of February
untilDate = DateValue(GetLatestDateFromData) 'returns 01/06/2017, 1st of June

看来我的日期格式有问题。不知何故,日子和月份是混杂的。我该如何解决?

谢谢

编辑:DateSerial(如链接线程中所建议)不适用于此处,因为我不仅关心日期,还关心时间。 DateSerial 只接受年-月-日作为参数。

【问题讨论】:

  • 如果这些真的是日期,那么格式就完全无关紧要了。 Excel 将日期/时间存储为自 1 Jan 1900 以来的天数和一天的小数部分。 =MIN(D:D) 将在 D 列中返回最早的日期/时间; =MAX(E:E) 将在 E 列中返回最新的日期/时间
  • 要在数组上使用该函数,只需将范围替换为一维数组即可。

标签: excel vba date datetime


【解决方案1】:

要修复日期,请使用格式功能,例如

date = Format(value, "MM\/DD\/YYYY")

您可以更轻松地比较与显示格式无关的实际值(例如 02/01/2017 06:07 等于 42737,2548611111)。

此外,我建议您使用 WorksheetFunction.Max 函数,它是等效于 excel Max 函数的 vba,返回您范围内的最大值,例如:

date = WorksheetFunction.Max(your_used_range)

【讨论】:

  • 所以,在进行任何操作之前,我先添加 Format 函数。它会自动理解格式为 DD/MM 并将其转换为 MM/DD...吗?如何将 02/01/2017 06:07 转换为 42737.25486...?这是什么功能?那个 max 函数看起来很有趣。如果你能回答这些问题,我会完全理解的,谢谢!
  • Dim dt As Date dt = WorksheetFunction.Min(Range("D2:D300")),这行得通,但是我该如何使用数组而不是使用 Range?
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多