VBA将日期从英国更改为美国

VBA将日期从英国更改为美国,vba,excel,Vba,Excel,我正在将数据从一个电子表格传输到另一个电子表格-我已确认电子表格A中的值为'42800',即2017年3月6日 当我运行VBA时,它只是将范围(“A1”)值传输到图纸(“示例”).Range(“A1”)值。显然,这是一个简化的示例,但为什么将日期存储为该值时,数据会传输到日期为'42889',即2017年6月3日(美国格式)的新工作表 42800的日期是否应不放在新表中?为什么要更改格式 ThisWorkbook.Worksheets("Example").Cells(rowx, 12).Val

我正在将数据从一个电子表格传输到另一个电子表格-我已确认电子表格A中的值为'42800',即2017年3月6日

当我运行VBA时,它只是将范围(“A1”)值传输到图纸(“示例”).Range(“A1”)值。显然,这是一个简化的示例,但为什么将日期存储为该值时,数据会传输到日期为'42889',即2017年6月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

不要将
.Value
传递给函数:

ThisWorkbook.Worksheets("Example").Cells(rowx, 12).Value = Validate_Date(wbBlank.Worksheets("A15").Range("J15"))
然后更改签名,使其采用
范围
而不是
字符串
,并返回一个
变量

Function ValidateDate(ByVal source As Range) As Variant
源.Value
不是
日期时,函数将返回空字符串指针(看起来像
空字符串,但分配的正好是0字节),否则:

    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
通过返回实际的
日期
,您不会通过隐式
字符串
转换来篡改该值


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

不要将
.Value
传递给函数:

ThisWorkbook.Worksheets("Example").Cells(rowx, 12).Value = Validate_Date(wbBlank.Worksheets("A15").Range("J15"))
然后更改签名,使其采用
范围
而不是
字符串
,并返回一个
变量

Function ValidateDate(ByVal source As Range) As Variant
源.Value
不是
日期时,函数将返回空字符串指针(看起来像
空字符串,但分配的正好是0字节),否则:

    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
通过返回实际的
日期
,您不会通过隐式
字符串
转换来篡改该值


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

这不是格式更改,而是值更改。给我们看看你的代码,现在你的问题无法回答。请参阅。将代码添加到示例中。“示例”中的日期为42800或2017年3月6日。确认为“英语(英国)日/月/年”将日期视为日期。您告诉VBA运行时为您执行一系列隐式转换,而这样做是在做假设。然后将字符串发送回Excel,现在Excel进行隐式转换并进行假设。将日期视为日期,可以避免问题。实际上,42800是单元格的
值。但是
TypeName(wbBlank.Worksheets(“A15”).Range(“J15”).Value)
将返回
Date
,因此VBA将42800视为
Date
(或者
Double
,如果它是空的话)-当您将它作为
字符串
参数传递给
Validate\u Date
时,VBA需要执行类型转换,以便
Validate\u Date
可以使用
字符串。将参数类型更改为
范围
(传递范围,而不是其值),并使用单元格的实际值,而不是其表示形式。检查
iError
IsBlank
,并返回
日期
,而不是
字符串
。非常感谢,您是一位传奇人物。这对我来说更有意义:)这不是格式的改变,而是值的改变。给我们看看你的代码,现在你的问题无法回答。请参阅。将代码添加到示例中。“示例”中的日期为42800或2017年3月6日。确认为“英语(英国)日/月/年”将日期视为日期。您告诉VBA运行时为您执行一系列隐式转换,而这样做是在做假设。然后将字符串发送回Excel,现在Excel进行隐式转换并进行假设。将日期视为日期,可以避免问题。实际上,42800是单元格的
值。但是
TypeName(wbBlank.Worksheets(“A15”).Range(“J15”).Value)
将返回
Date
,因此VBA将42800视为
Date
(或者
Double
,如果它是空的话)-当您将它作为
字符串
参数传递给
Validate\u Date
时,VBA需要执行类型转换,以便
Validate\u Date
可以使用
字符串。将参数类型更改为
范围
(传递范围,而不是其值),并使用单元格的实际值,而不是其表示形式。检查
iError
IsBlank
,并返回
日期
,而不是
字符串
。非常感谢,您是一位传奇人物。现在,这对我来说更有意义了:)很抱歉,我迟迟没有接受这个答案,它确实工作得很好——多亏了你,我觉得用Excel和VBA处理日期更舒服。长命百岁!很抱歉延迟接受这个答案,它确实工作得很好-感谢你,我觉得在Excel和VBA中处理日期更舒服。长命百岁!