Vba 修剪功能导致日期格式更改

Vba 修剪功能导致日期格式更改,vba,excel,Vba,Excel,首先,需要注意的是,我在英国,所以标准日期格式是dd/mm/yyyy 在A1中,我有一个日期:2017年5月2日(dd/mm/yyyy) 我可以在即时窗口中确认这一点: ?CLng(Range("A1").Value) 42857 现在,如果我执行以下操作: Range("A1").Value = Range("A1").Value 您可能会猜到,什么都没有发生-日期仍然是2017年5月2日,数值仍然是42857 但如果我使用trim: Range("A1").Value = Trim(Ra

首先,需要注意的是,我在英国,所以标准日期格式是dd/mm/yyyy

在A1中,我有一个日期:2017年5月2日(dd/mm/yyyy)

我可以在即时窗口中确认这一点:

?CLng(Range("A1").Value)
42857
现在,如果我执行以下操作:

Range("A1").Value = Range("A1").Value
您可能会猜到,什么都没有发生-日期仍然是2017年5月2日,数值仍然是42857

但如果我使用trim:

Range("A1").Value = Trim(Range("A1").Value)
日期更改为2017年2月5日。这不仅仅是格式化-数值也已更改为42771



什么是
Trim()
方法导致以美国格式读取日期,然后使用新的日期值转换回英国格式?这是一个bug吗?

来自评论中的讨论:

VBA中的默认或“标记”格式(不是Excel本身,正如Macro Man正确指出的那样)是美式英语-无论区域设置或单元格格式如何

在日期上执行VBA文本函数时,这些函数的输出为文本格式。因此
Trim(Range(“A1”).Value)
的结果是一个字符串。该字符串恰好类似于正确的美国日期,因此当您将其插入单元格时,Excel会将其识别为美国日期

因此发生了两个隐式转换。第一种情况发生在读取单元格内容并将其传递给
trim()
:date->text conversion;第二种情况发生在将其写回Excel单元格时:文本->日期转换。第二次转换没有关于格式的信息,因此它假设我们是英语


(您应该能够使用任何文本函数获得相同的结果,而不仅仅是
trim()

这主要是一个有根据的猜测:Excel使用美国英语格式作为“国际”或“令牌”格式。当您使用.Value解析日期时,它将被读取为文本。如果通过任何VBA函数运行它,文字文本将被识别为日期(错误地假定为“标准”美国格式)。所以当你写回的时候,错误的日期被写进了单元格。您能否尝试
?Trim(Range(“A1”).Value)
查看它在立即数中返回的内容?尝试使用
.Value2
,或者尝试使用ISO标准格式(yyyy-mm-dd)。
Trim(Range(“A1”).Value)
返回正确的日期-我知道VBA使用的是我们而不是操作系统区域,但我并没有要求它将任何内容转换为日期,因此它在这里不应该有任何效果。它似乎只有在修剪后将值写回单元格时才会更改。修剪值本身实际上仍然正确修剪是一个文本函数,其输出是一个文本。Excel将该文本识别为美式英语格式的日期。这意味着任何文本函数都会产生相同的结果,比如:
Range(“A1”)。Value=Range(“A1”)。Value&
?cdate(Trim(“02/05/2017”))发生相同的情况。
我想说的是,有一个日期-->文本和一个文本-->日期转换正在悄然发生,在第二次转换时,没有考虑单元格格式或操作系统区域设置。是的,只是做了更多的测试,因为Trim返回一个隐式字符串,VBA忽略区域设置。在写回单元格之前,区域设置被解释为US格式。如果你想发布一个我接受的答案,请注意术语,尽管它实际上是VBA,默认为美国格式,而不是Excel。