转置具有日期的数组会更改日期

时间:2016-03-16 17:58:02

标签: excel-vba vba excel

行为:

当我转换包含日期的1维数组时,为了将它们整体打印到工作表中,某些日期会从dd/mm/yy更改为mm/dd/yyyy

特别是当月的某一天:

  • 小于或等于12,例如January 2, 2016 (02/01/16)May 11, 2016 (11/05/16),然后使用日期格式mm/dd/yy打印日期并对齐。
  • 大于或等于13,例如April 23, 2016 (23/04/16)December 17, 2016 (17/12/16),则日期将使用日期格式dd/mm/yyyy打印并向左对齐。

当我使用for循环分别打印每个日期,或者我没有转置数组并在每列的第一行打印每个日期时,所有日期都以dd/mm/yy格式和所有日期打印对齐了。

问题:

如果这是正常行为或者这是一个错误/功能,有人可以解释为什么会发生这种情况。

其他信息:

我有:

  • Windows 8.1(英国美国)
  • Office 365学生(美国英语)(Excel 2016 32位)
  • 区域设置:荷兰

代码:

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

结果:

Result

4 个答案:

答案 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 写回工作表中的数组解决了这个问题。