VBA从英国到美国的变更日期

时间:2017-06-30 15:35:04

标签: excel vba excel-vba

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

当我运行我的VBA时,只需转移范围(" A1")。值到表格("示例")。范​​围(" A1")。值。显然这是一个简化的例子,但是为什么当日期存储为该值时,数据是传输到新工作表的日期为' 42889'这是2017年3月3日(美国格式)。

42800的日期是否应该放在新表中?为什么要进行格式更改?

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

验证日期为

Function Validate_Date(s1 As String) As String

    If (IsDate(s1)) Then
        Validate_Date = s1

    Else
        Validate_Date = ""
    End If

End Function

1 个答案:

答案 0 :(得分:2)

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

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

然后更改您的签名,使其成为Range而不是String,并返回Variant

Function ValidateDate(ByVal source As Range) As Variant

""不是source.Value时,该函数将返回一个空字符串指针(看起来像Date空字符串,但只分配0字节),{{1}否则:

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次转化来篡改该值。

请注意,我从您的函数名称中删除了下划线;下划线在VBA中具有特殊含义,当您进入更高级的OOP编程时,您会发现当您在公共接口成员名称中有下划线时,您的项目会停止编译 - 所以即使您从未在VBA中实现接口,采用和坚持String命名惯例是一个好主意。