我正在尝试编写一些需要两个日期的代码,并创建这两个日期之间的每一天的列表。我的代码是这样的:
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
格式之间存在切换。我究竟做错了什么?
我怀疑您计算机的区域系统使用某种形式的DMY作为其默认日期设置。尽管Excel默认情况下使用计算机的区域设置,但VBA始终使用北美MDY。这是为了使代码可以被不同的区域使用,而不必将每种形式的编码日期例程都转录到区域设置中。有一些方法可以解决VBA以EN-US为中心的方法(想到的是Range.FormulaLocal属性),但出于所有目的和目的,如果您使用VBA进行编码,则需要使用MDY进行编码。
如果将列A充分加宽,则会看到2001年1月13日到2001年1月31日之间的值是左对齐的,而其他值是右对齐的。这是第一个暗示,它们是文本值,而不是实际的日期(也称为数字)。
忘记一分钟的日期,然后将值视为一系列长整数,从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属性)只是自1899年12月31日以来的天数。在工作表上如何显示它可能默认为用户的区域设置,但是您可以按照自己认为合适的任何方式显示它们。
提示:在日期样式数字格式中,有两种以星号开头的数字格式。在分配给具有各种区域设置的计算机之间的工作簿中,这些将更改为在其下运行驻留计算机的MDY或DYM。
有关将字符串转换为日期VBA的DMY / MDY的VBA编码的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句