当我转换包含日期的1维数组时,为了将它们整体打印到工作表中,某些日期会从dd/mm/yy
更改为mm/dd/yyyy
。
特别是当月的某一天:
January 2, 2016 (02/01/16)
或May 11, 2016 (11/05/16)
,然后使用日期格式mm/dd/yy
打印日期并对齐。April 23, 2016 (23/04/16)
或December 17, 2016 (17/12/16)
,则日期将使用日期格式dd/mm/yyyy
打印并向左对齐。当我使用for循环分别打印每个日期,或者我没有转置数组并在每列的第一行打印每个日期时,所有日期都以dd/mm/yy
格式和所有日期打印对齐了。
如果这是正常行为或者这是一个错误/功能,有人可以解释为什么会发生这种情况。
我有:
Option Explicit
Sub TransposeDatesArray()
Dim arrDates() As Date
Dim i As Variant
ReDim arrDates(0)
For i = CDate("Januari 01, 2016") To CDate("December 31, 2016")
If UBound(arrDates) = 0 Then
ReDim arrDates(1 To 1)
Else
ReDim Preserve arrDates(1 To UBound(arrDates) + 1)
End If
arrDates(UBound(arrDates)) = i
Next
With ThisWorkbook.Worksheets(1)
.Cells.Delete
.Cells(1, 1).Resize(UBound(arrDates)).Value = Application.Transpose(arrDates)
.Cells(1, 2).Resize(UBound(arrDates)).Value2 = Application.Transpose(arrDates)
.Cells(1, 3).Resize(UBound(arrDates)).Formula = Application.Transpose(arrDates)
For i = LBound(arrDates) To UBound(arrDates)
.Cells(i, 4).Value = arrDates(i)
.Cells(i, 5).Value2 = arrDates(i)
.Cells(i, 6).Formula = arrDates(i)
Next
End With
End Sub
答案 0 :(得分:2)
在做了更多研究后,我发现了以下内容:
似乎Application.Transpose(arrDate)
不仅会转换数组,还会将日期值存储为实际日期。
考虑日期42373
(2016年1月4日)
Debug.Print Format(CDate(42373), "mmmm d, yyyy")
januari 4, 2016
Debug.Print Application.Transpose(Format(CDate(42373), "mmmm d, yyyy"))
april 1, 2016
当存储为实际日期时,似乎可以转置日期值。转置有效地将日期从day/month
重新排序到month/day
,之后月份成为日期,而日期变为月份,因为系统仍使用day/month
格式。这只能在月份的日期为12或更少的情况下才能完成,因为在将日期转换为月份之后。
答案 1 :(得分:1)
我遇到了这个问题,但有趣的是,转置时的日期切换(从dd / mm到mm / dd)只发生在我从工具栏按钮运行宏时;如果我从VBA编辑器内部运行它,或者从Developer菜单> Macros对话框运行它,它运行正常。 为了使其工作无论我从哪里运行宏,我在转置之前添加了一个函数,将所有日期转换为字符串(循环遍历我的数组并使用CStr函数),然后在转置后从字符串转换回日期(另一个循环和CDate函数) - 循环必须略有不同,以考虑转置的尺寸。
答案 2 :(得分:0)
使用Application.Transpose()转换数组将“日期”数据类型转换为“字符串”。无法解释原因。 因此,我的建议是在执行Application.Transpose()之前(仅使用CLng)将具有“日期”数据类型的列转换为“长”。 之后,您可以将其转换回“日期”,也可以仅将数字格式设置为“日期”,以粘贴单元格。
答案 3 :(得分:0)
我使用 .FormulaLocal 写回工作表中的数组解决了这个问题。