【问题标题】:Why does transposing array with dates in format dd/mm/yy change some dates to mm/dd/yy format?为什么转置日期格式为 dd/mm/yy 的数组会将某些日期更改为 mm/dd/yy 格式?
【发布时间】:2016-03-16 17:58:01
【问题描述】:

行为:

当我转置一个包含日期的一维数组以便将它们完整地打印到一张纸上时,一些日期从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

结果:

【问题讨论】:

  • 您只是向我们展示了格式化的值。也许您可以在它旁边添加第二张屏幕截图,向我们展示未格式化的值(这些单元格中真正存储的内容为.Value2.Formula)?在我看来,并非所有日期都被这样识别。
  • @Ralph,我更新了代码并添加了屏幕截图以显示 .Value2.Formula 结果。
  • 完美。在这种情况下,我会转置.Value2,然后将单元格的格式更改为所需的日期格式。请注意,该日期本质上是数字:42409 = 00.01.1900 之后的 42409 天,0.75 = 一天的四分之三 = 18:00。使用.NumberFormat = "[$-409]d-mmm-yy;@"(例如)更改格式。
  • @Ralph 我正在寻找的是为什么的答案,当数组被转置时 Excel 突然在日期上表现得很奇怪,但在遍历数组时表现正常,或者只是不转置数组,.最简单的解决方法是将数组声明为long,将日期存储为数字,然后在打印数字的范围内使用.Numberformat = "dd/mm/yy"
  • 每当您在单元格中输入任何内容时,Excel 都会自动尝试评估您想要的内容并相应地对其进行格式化。复制和粘贴数据时也会发生同样的情况。然而,日期格式有些误导。 / 向您的 NL Excel 指示一个外国日期,当它通常期望 - 根据此:en.wikipedia.org/wiki/Date_format_by_country。因此,我假设它尝试使用 mm/dd/yyyy 将日期评估为美国日期。

标签: excel vba


【解决方案1】:

在做了更多研究之后,我发现了以下内容:

似乎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 天或更少时才能完成,因为在转置后,天就变成了月份。

【讨论】:

  • 虽然我无法在我的计算机上确认您的发现(两个调试打印产生相同的结果是 2016 年 1 月 4 日),但我很高兴您找到了一个可行的解决方案。
  • 我刚刚发布了关于您的问题的变体 (stackoverflow.com/questions/53348333/…),有人将我指向这里。到目前为止,我无法修复它,而是避免转置。我可以贡献的一点是,如果在本地窗口中查看转置日期数组——您可以看到转置后日期变为字符串。无论出于何种原因,我猜 Transpose 会创建一个新数组,但不会使其成为相同的类型。仍然奇怪的是那些本地字符串的格式是正确的。但是在粘贴时会误读。
【解决方案2】:

使用 Application.Transpose() 转置数组将“日期”数据类型转换为“字符串”。无法解释为什么。 所以我的建议是在执行 Application.Transpose() 之前将具有“Date”数据类型的 Column 转换为“Long”(只需使用 CLng)。 之后,您可以将其转换回“日期”,也可以将单元格的数字格式设置为“日期”,然后在其中粘贴数组。

【讨论】:

    【解决方案3】:

    我遇到了这个问题,但有趣的是,转置上的日期切换(从 dd/mm 到 mm/dd)仅在我从工具栏按钮运行宏时发生;如果我从 VBA 编辑器中运行它,或者从开发人员菜单>宏对话框中运行它,它工作正常。 为了使它无论从哪里运行宏都可以工作,我在转置之前添加了一个函数以将所有日期转换为字符串(循环遍历我的数组并使用 CStr 函数),然后在转置之后从字符串转换回日期(另一个循环和 CDate 函数)- 循环必须稍微不同才能考虑转置维度。

    【讨论】:

      【解决方案4】:

      我使用 .FormulaLocal 将数组写回到工作表中解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2012-03-05
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多