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

标签 vba excel

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

在 A1 中,我有一个日期:02/05/2017 (dd/mm/yyyy)

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

?CLng(Range("A1").Value)
42857

现在,如果我执行以下操作:

Range("A1").Value = Range("A1").Value

你可能会猜到,没有任何反应 - 日期仍然是 02/05/2017,数值仍然是 42857

但是如果我使用它修剪:

Range("A1").Value = Trim(Range("A1").Value)

日期更改为 05/02/2017。这不仅仅是格式化 - 数值也更改为 42771。


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

最佳答案

来自评论中的讨论:

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

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

因此发生了两次隐式转换。第一种情况发生在您读取单元格内容并将其传递给 trim() 时:日期->文本转换;当您将其写回 Excel 单元格时,会发生第二种情况:文本->日期转换。第二次转换没有有关格式的信息,因此它假定使用美国英语。

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

关于vba - 修剪功能导致日期格式更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44304709/

相关文章:

vba - 微软 Access 2010 : Prevent Save in Main Form On Move to Subform

excel - 将 ssis 包中的数据导出到 Excel 目标时出错

vba - 如何动态更新VBA形式的标签标题?

excel - 在 JS API 中查找 Excel 中的可用范围

excel - 在excel中将列转换为分隔列表

vba - 防止 WebBrowser 控件刷新焦点

vba - 如何避免在循环vba中选择动态行

excel - 将 MS Access 表拆分为多个部分并使用 VBA 导出到 Excel

VBA:Variant/Double 和 Double 之间的区别

vba - 我们可以使用单个语句将字典键分配给列吗?