我写了两行简单的VBA代码来读取和写入一个单元格的日期,但出乎意料的是在运行后交换了月份和日期。步骤是:
输入日期" 2017年1月11日"在单元格A1中。日期现在显示为" 01/11 / 2017"。
运行以下代码行:
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"不遵循Region中的日期格式设置。我尝试使用不同的短日期格式设置,但这不会改变Excel转换字符串的方式。
所以我的问题是:什么可以解释日和月的交换?什么控制Excel如何读取日期字符串并写入单元格?
答案 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
<强>截图强>