列出两个日期之间的天数

Listing days between two dates

我正在尝试编写一些需要两个日期的代码,并创建这两个日期之间每一天的列表。我的代码是这样的:

Sub DateList()

    Dim start As Date
    start = DateValue("1/1/2001")

    Dim finish As Date
    finish = DateValue("1/1/2002")

    Dim datearray()
    ReDim datearray(finish - start + 1)

    For i = 0 To finish - start
        datearray(i) = start + i
    Next

    Range("A1:A" & UBound(datearray) + 1) = WorksheetFunction.Transpose(datearray)

End Sub

然而结果是这样的:

   1/01/2001
   1/02/2001
   1/03/2001
   1/04/2001
   1/05/2001
   1/06/2001
   1/07/2001
   1/08/2001
   1/09/2001
   1/10/2001
   1/11/2001
   1/12/2001
13/01/2001
14/01/2001
15/01/2001
16/01/2001
17/01/2001
18/01/2001
19/01/2001
20/01/2001
21/01/2001
22/01/2001
23/01/2001
24/01/2001
25/01/2001
26/01/2001
27/01/2001
28/01/2001
29/01/2001
30/01/2001
31/01/2001
   2/01/2001
   2/02/2001
   2/03/2001
      ....

到了第13行就可以看到有问题了。似乎在线的某个地方有 dd/mm/yyyy 格式和 mm/dd/yyyy 格式之间的切换。我做错了什么?

将此行添加为程序的最后一行:

    Range(A:A).NumberFormat = "d/mm/yyyy"

...或将范围设置为您喜欢的任何日期格式。

我怀疑您计算机的区域系统使用某种形式的 DMY 作为其默认日期设置。尽管 Excel 默认使用计算机的区域设置,但 VBA 始终使用北美 MDY。这是为了代码可以被不同的区域使用,而无需将每种形式的编码日期例程转录到区域设置中。有一些方法可以绕过 VBA 以 EN-US 为中心的方法(想到 Range.FormulaLocal property),但出于所有意图和目的,如果您在 VBA 中编码,您需要MDY 中的代码。

如果充分加宽 A 列,您会看到从 13-Jan-2001 到 31-Jan-2001 的值左对齐,而其他值右对齐。这是第一个暗示它们是文本值而不是实际日期(又名数字)的提示。

暂时忘掉日期,将这些值视为从 36,892 开始到 37,257 的一系列长整数。

Sub DateList()
    Dim start As Long, finish As Long
    Dim datearray As Variant, i As Long

    start = CLng(DateValue("1/1/2001"))
    finish = CLng(DateValue("1/1/2002"))

    ReDim datearray(finish - start + 1)

    For i = 0 To finish - start
        datearray(i) = start + i
    Next

    Range("A1:A" & UBound(datearray) + 1) = WorksheetFunction.Transpose(datearray)
    Range("A1:A" & UBound(datearray) + 1).NumberFormat = "dd-mmm-yyyy"
End Sub

请记住,日期的原始基础值(即 Range.Value2 property)只是自 1899 年 12 月 31 日以来的天数。您在工作表上的显示方式可能默认为用户的区域设置,但您可以按照您认为合适的方式显示它们。

提示:在日期样式数字格式中,有两种以星号开头的数字格式。在分布在具有不同区域设置的计算机之间的工作簿中,这些将更改为驻留计算机 运行 所在的任何 MDY 或 DYM。

更多关于 VBA DMY/MDY 编码的信息在