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

使用VBA读写后,Excel日期已更改(月和日已交换),excel,vba,date,formatting,Excel,Vba,Date,Formatting,我写了两行简单的VBA代码来读取单元格并将日期写入单元格,但在运行之后,月和日意外地交换了。这些步骤是: 在单元格A1中输入日期“2017年11月1日”。日期现在显示为“2017年11月1日” 运行以下代码行: Dim s As String s = Cells(1, 1).value Cells(2, 1).value = s 单元格B1现在显示“11/01/2017”,并交换了月份和日期 我在Windows区域中的短日期格式设置为“dd/MM/yyyy”,因此字符串s存储值“01/11/

我写了两行简单的VBA代码来读取单元格并将日期写入单元格,但在运行之后,月和日意外地交换了。这些步骤是:

  • 在单元格A1中输入日期“2017年11月1日”。日期现在显示为“2017年11月1日”

  • 运行以下代码行:

    Dim s As String
    s = Cells(1, 1).value
    Cells(2, 1).value = s
    
  • 单元格B1现在显示“11/01/2017”,并交换了月份和日期

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

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

    Dim s As String
    s = Cells(1, 1).Value
    
    s=单元格(1,1)。value
    将单元格的
    存储在
    字符串中。不是在牢房里看到的

    比如说

    如果您的单元格具有
    2017年11月1日
    ,但格式设置为显示
    2017年11月1日
    ,则
    s
    将存储
    2017年11月1日
    。这不是约会。它是一个
    字符串
    。如果你不相信我,那就试试这个

    Dim s As String
    s = Cells(1, 1).Value
    Debug.Print s + 1 '<~~ You will get a Type Mismatch error
    
    屏幕截图


    Dim s作为字符串更改为
    Dim s作为日期
    或将
    单元格(2,1)更改为
    单元格(2,1)。value=s
    更改为
    单元格(2,1)。value=DateValue(s)
    谢谢,我同意这是一种变通方法,因为在第一种方法中,没有字符串的转换,因此没有歧义,在第二种方法中,DateValue在执行转换之前检查短日期格式设置。但我仍然想知道为什么Excel在将字符串直接写入单元格时会出现这种行为,因为这样做时可能不记得采用您的方法,我希望避免这种情况。这不是一种解决方法。。。我已经在打答案了。给我几分钟:)谢谢,我知道你的方法很有效,我也可以考虑使用
    CDate
    检查区域中的短日期设置,将字符串转换为日期。但我感兴趣的是基于Excel的隐式转换。您提到“以一种感觉最好的格式(基于区域设置)”-您能否澄清区域设置Excel中的哪个字段?
    Dim s As Date
    s = Cells(1, 1).Value
    Debug.Print s + 1 '<~~ You will get a proper date
    
    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