Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么将日期转换为dd/mm/yy格式的数组会将某些日期更改为mm/dd/yy格式? 行为:_Excel_Vba - Fatal编程技术网

Excel 为什么将日期转换为dd/mm/yy格式的数组会将某些日期更改为mm/dd/yy格式? 行为:

Excel 为什么将日期转换为dd/mm/yy格式的数组会将某些日期更改为mm/dd/yy格式? 行为:,excel,vba,Excel,Vba,当我转置一个包含日期的一维数组,以便将它们全部打印到一张图纸上时,一些日期会从dd/mm/yy更改为mm/dd/yyyy 特别是,当月份的某一天: 小于或等于12,例如2016年1月2日(02/01/16),或2016年5月11日(11/05/16),则使用日期格式打印日期,并向右对齐 大于或等于13,例如2016年4月23日(23/04/16),或2016年12月17日(17/12/16),则使用日期格式dd/mm/yyyy打印日期,并向左对齐 当我使用for循环单独打印每个日期时,或者我

当我转置一个包含日期的一维数组,以便将它们全部打印到一张图纸上时,一些日期会从
dd/mm/yy
更改为
mm/dd/yyyy

特别是,当月份的某一天:

  • 小于或等于12,例如2016年1月2日(02/01/16),或2016年5月11日(11/05/16),则使用日期格式打印日期,并向右对齐
  • 大于或等于13,例如
    2016年4月23日(23/04/16)
    ,或
    2016年12月17日(17/12/16)
    ,则使用日期格式
    dd/mm/yyyy
    打印日期,并向左对齐
当我使用for循环单独打印每个日期时,或者我不转换数组并在每个列的第一行中打印每个日期,但是,所有日期都以
dd/mm/yy
格式打印,并且所有日期都向右对齐

其他信息: 我有:

  • Windows 8.1(英语和美国)
  • Office 365学生(美国英语)(Excel 2016 32位)
  • 地区设置:荷兰
代码: 结果:

在做了更多的研究之后,我发现了以下几点:

似乎
Application.Transpose(arrDate)
不仅转换数组,而且还转换存储为实际日期的日期值

考虑一下日期,
42373
(2016年1月4日)

  • Debug.Print格式(CDate(42373),“mmmm d,yyyy”)
    • 生产2016年1月4日<代码>
  • Debug.Print Application.Transpose(格式为CDate(42373),“mmmm d,yyyy”)
    • 2016年4月1日生产

当存储为实际日期时,似乎可以转换日期值。转置有效地将日期从
日/月
重新排序到
月/日
,之后月变为日,日变为月,因为系统仍然使用
日/月
格式。只有当一个月的日期小于等于12日时,才能这样做,因为在将日期转换为月份之后。

在做了更多的研究之后,我发现了以下几点:

似乎
Application.Transpose(arrDate)
不仅转换数组,而且还转换存储为实际日期的日期值

考虑一下日期,
42373
(2016年1月4日)

  • Debug.Print格式(CDate(42373),“mmmm d,yyyy”)
    • 生产2016年1月4日<代码>
  • Debug.Print Application.Transpose(格式为CDate(42373),“mmmm d,yyyy”)
    • 2016年4月1日生产

当存储为实际日期时,似乎可以转换日期值。转置有效地将日期从
日/月
重新排序到
月/日
,之后月变为日,日变为月,因为系统仍然使用
日/月
格式。只有当月份的日期小于等于12时才能执行此操作,因为在转置后,日期变为月份。

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

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

使用应用程序转置数组。转置()将“日期”数据类型转换为“字符串”。无法解释原因。 因此,我的建议是在执行Application.Transpose()之前,将数据类型为“Date”的列转换为“Long”(仅使用CLng)。
之后,您可以将其转换回“日期”,或者只将要粘贴数组的单元格的数字格式设置为“日期”。

使用应用程序转换数组。Transpose()将“日期”数据类型转换为“字符串”。无法解释原因。 因此,我的建议是在执行Application.Transpose()之前,将数据类型为“Date”的列转换为“Long”(仅使用CLng)。
之后,您可以将其转换回“日期”,或将单元格的数字格式设置为“日期”,您希望粘贴数组的位置。

我使用.FormulaLocal在工作表中写回数组来解决此问题。

我使用.FormulaLocal在工作表中写回数组来解决此问题。

您只是向我们显示格式化的值。也许您可以在旁边添加第二个屏幕截图,显示未格式化的值(这些单元格中实际存储的值是
.Value2
.Formula
)?在我看来,并不是所有的日期都能被识别。@Ralph,我已经更新了代码并添加了一个屏幕截图来显示
.Value2
.Formula
结果。完美。在这种情况下,我会转置
.Va
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