在两个date之间列出天数

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

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格式之间的切换。 我究竟做错了什么?

我怀疑你的计算机的区域系统使用某种forms的DMY作为它的默认date设置。 尽pipe默认情况下Excel使用计算机的区域设置,但VBA始终使用北美的MD​​Y。 这是为了使代码可以被不同的地区使用,而不必将每种forms的编码date程序转录到区域设置中。 有一些方法来解决VBA的以EN-US为中心的方法(想到Range.FormulaLocal属性 ),但是对于所有的意图和目的,如果你用VBA编码,你需要用MDY编码。

如果您充分展开A栏,您将看到2001年1月13日至2001年1月31日的值保持alignment,而其他值则右alignment。 这是第一个提示,他们是文本值,而不是实际的date(又名数字)。

忘记一分钟的date,并将这些值看作一系列长整数,从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 

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

DMY与MDY

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

更多关于在转换string到dateVBA的 DMY / MDY的VBA编码。

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

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

…或将范围设置为您喜欢的任何date格式。