VBA更改从英国到美国的date

我将数据从一个电子表格传输到另一个电子表格 – 我已经确认,在电子表格A中,所持有的值是“42800”,即06/03/2017。

当我运行我的VBA,它只是将范围(“A1”)。值转换为表(“示例”)。范围(“A1”)。值。 显然这是一个简单的例子,但是为什么当date被存储为那个值是数据转移到了'42889'这个date是03/06/2017(美国格式)的新表。

42800的date不应该放在新表中吗? 为什么会进行这种格式更改?

ThisWorkbook.Worksheets("Example").Cells(rowx, 12).Value = Validate_Date(wbBlank.Worksheets("A15").Range("J15").Value) 

validationdate是

 Function Validate_Date(s1 As String) As String If (IsDate(s1)) Then Validate_Date = s1 Else Validate_Date = "" End If End Function 

不要将.Value传递给你的函数:

 ThisWorkbook.Worksheets("Example").Cells(rowx, 12).Value = Validate_Date(wbBlank.Worksheets("A15").Range("J15")) 

然后改变你的签名,使它取代一个String而不是一个Range ,并返回一个Variant

 Function ValidateDate(ByVal source As Range) As Variant 

source.Value不是Date ,函数将返回一个空string指针(看起来像一个""空string,但分配正好0字节),否则source.Value

  If IsDate(source.Value) Then ValidateDate = source.Value ' that's definitely a date Else ValidateDate = vbNullString ' value was empty, error, or anything "not a date" End If 

通过返回实际的Date ,您不会通过隐式String转换篡改值。

请注意,我从你的函数名称中删除了下划线。 下划线在VBA中有特殊的意义,当你进入更高级的OOP编程时,你会发现当你在公共接口成员名称中有下划线时,你的项目停止编译 – 所以即使你从来没有在VBA中实现一个接口,坚持使用PascalCase命名约定是个好主意。