使用 VBA 读写后 Excel 日期更改(月份和日期交换)
Posted
技术标签:
【中文标题】使用 VBA 读写后 Excel 日期更改(月份和日期交换)【英文标题】:Excel date changed (month and day swapped) after reading and writing with VBA 【发布时间】:2018-05-16 11:09:57 【问题描述】:我编写了两行简单的 VBA 代码来读取和写入日期到单元格,但意外地在运行后月份和日期交换了。步骤是:
在单元格 A1 中输入日期“2017 年 1 月 11 日”。日期现在显示为“01/11/2017”。
运行以下代码行:
Dim s As String
s = Cells(1, 1).value
Cells(2, 1).value = s
单元格 B1 现在显示“11/01/2017”,月份和日期已交换。
我在 Windows 中的 Region 中的短日期格式设置是“dd/MM/yyyy”,因此字符串 s 存储值“01/11/2017”。但是,在写入单元格时,Excel 将字符串 s 隐式转换为假定为“mm/dd/yyyy”的日期,而不遵循 Region 中的日期格式设置。我尝试使用不同的短日期格式设置,但这并没有改变 Excel 转换字符串的方式。
所以我的问题是:什么可以解释日期和月份的交换?什么控制 Excel 如何读取日期字符串并写入单元格?
【问题讨论】:
将Dim s As String
更改为 Dim s As Date
或将 Cells(2, 1).value = s
更改为 Cells(2, 1).Value = DateValue(s)
谢谢,我同意这是一种解决方法,因为在第一种方法中,没有与字符串的转换,因此没有歧义,在第二种方法中,DateValue 检查短日期格式转换前的设置。但我仍然想知道为什么 Excel 在将字符串直接写入单元格时会如此表现,因为这样做时可能并不总是记得采用您的方法,我想避免这种情况。
这不是解决方法...我已经在输入答案。给我几分钟:)
【参考方案1】:
Dim s As String
s = Cells(1, 1).Value
s = Cells(1, 1).value
会将单元格的value
存储在String
中。不是它在单元格中显示的内容。
例如
如果您的单元格有11/1/2017
,但被格式化为显示01/11/17
,那么s
将存储11/1/2017
。这不是约会。这是一个String
。如果你不相信我,那就试试这个
Dim s As String
s = Cells(1, 1).Value
Debug.Print s + 1 '<~~ You will get a Type Mismatch error
现在试试这个
Dim s As Date
s = Cells(1, 1).Value
Debug.Print s + 1 '<~~ You will get a proper date
==> 当您尝试将包含日期的String
存储到具有General
格式的单元格中时,Excel 会将字符串转换为您感觉的格式的日期最好(基于区域设置)。这就是你的情况。
分辨率:
1
声明一个Date
变量,然后将值存储在其中。例如:Dim s As Date
或
2
将字符串转换为日期,然后存储。 Excel 不会改变它。这就是DateValue(s)
所做的。
一些测试
让我们来看看这 3 个场景
Sub SampleA()
Dim s As Date
s = Cells(1, 1).Value
Cells(2, 1).Value = s
End Sub
Sub SampleB()
Dim s As String
s = Cells(1, 1).Value
Cells(2, 1).Value = DateValue(s)
End Sub
Sub SampleC() '<~~ As Suggested in the other answer
Dim s As String
s = Cells(1, 1).Value
Cells(2, 1).NumberFormat = "dd/MM/yyyy"
Cells(2, 1).Value = s
End Sub
截图
【讨论】:
谢谢,我知道您的方法有效,我可以考虑使用CDate
以及检查 Region 中的短日期设置以将字符串转换为日期。但我感兴趣的是基于 Excel 进行的隐式转换。而且您提到“以一种感觉最好的格式(基于区域设置)”-您能否澄清 Excel 查看区域设置中的哪个字段?以上是关于使用 VBA 读写后 Excel 日期更改(月份和日期交换)的主要内容,如果未能解决你的问题,请参考以下文章
如何用EXCEL VBA批量提取JPG文件日期时间信息到表格中?
使用 VBA 在 Access 表中插入当前月份的每个日期记录