我将数据从一个电子表格传输到另一个电子表格 - 我已经确认,在电子表格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
答案 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
命名惯例是一个好主意。