使用 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 表中插入当前月份的每个日期记录

VBA 操作 Excel 生成日期及星期

在EXCEL中,需要一个在某一个日期就自杀的工作溥VBA代码

如何使用 VBA 在 Excel 注释中查找和替换日期格式

VBA for Excel - 如果更深的选择案例不匹配标准,请再次避免输入代码