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
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日生产
- 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日生产
- 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