使用VBA读取和写入后,Excel日期已更改(月份和日期交换)

时间:2017-12-02 14:08:37

标签: excel-vba date formatting vba excel

我写了两行简单的VBA代码来读取和写入一个单元格的日期,但出乎意料的是在运行后交换了月份和日期。步骤是:

  1. 输入日期" 2017年1月11日"在单元格A1中。日期现在显示为" 01/11 / 2017"。

  2. 运行以下代码行:

    Dim s As String
    s = Cells(1, 1).value
    Cells(2, 1).value = s
    
  3. 单元格B1现在显示" 11/01/2017"与月份和日期交换。

  4. 我在Windows中的区域中的短日期格式设置是" dd / MM / yyyy"所以字符串s存储值" 01/11 / 2017"。但是,当写入单元格时,Excel会隐式地将字符串s转换为假设" mm / dd / yyyy"不遵循Region中的日期格式设置。我尝试使用不同的短日期格式设置,但这不会改变Excel转换字符串的方式。

    所以我的问题是:什么可以解释日和月的交换?什么控制Excel如何读取日期字符串并写入单元格?

1 个答案:

答案 0 :(得分:3)

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

==&gt; 当您尝试将包含日期的String存储到具有General格式的单元格时,Excel会将字符串转换为日期格式感觉最好的格式(根据区域设置)。这就是你的情况。

解决

1声明Date变量,然后将值存储在其中。例如:Dim s As Date

OR

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

<强>截图

enter image description here