列出两个日期之间的天数
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 编码的信息在 。
我正在尝试编写一些需要两个日期的代码,并创建这两个日期之间每一天的列表。我的代码是这样的:
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 编码的信息在