VBA将日期从英国更改为美国
我正在将数据从一个电子表格传输到另一个电子表格-我已确认电子表格A中的值为'42800',即2017年3月6日 当我运行VBA时,它只是将范围(“A1”)值传输到图纸(“示例”).Range(“A1”)值。显然,这是一个简化的示例,但为什么将日期存储为该值时,数据会传输到日期为'42889',即2017年6月3日(美国格式)的新工作表 42800的日期是否应不放在新表中?为什么要更改格式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
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中处理日期更舒服。长命百岁!