繁体   English   中英

VBA cDate 不适用于 Mac excel 2011(14.7.1)

[英]VBA cDate not working on Mac excel 2011(14.7.1)

我正在尝试使用 VBA 脚本将日期转换为 long。 下面是代码片段

Sub test()
    Dim str as string
    Dim d as variant
    str="1/1/2016"
    d=cdate(str)
end sub

上面的代码段在 Windows 上运行良好,但在 MAC 上给了我类型不匹配错误。 在日期中转换有效字符串是否有任何周转。

您的区域设置是根本原因。

你可以尝试修改它们吗?

defaults write NSGlobalDomain AppleICUDateFormatStrings -dict 1 dd/MM/yyyy

您的代码确实在我的本地 OS X 机器上使用 Excel 运行。 不过,我有不同的区域设置。 我建议尝试使用国际日期格式(“YYYY-mm-dd”)。

Sub Main
    Dim str as String
    Dim d as Variant
    str = "2016-01-01"
    d = CDate(str)
End Sub

或者,您可以尝试“2016 年 1 月 1 日”。


PS:您可以在 OS X 中的系统偏好设置 -> 语言和地区 -> 高级 -> 日期下查看您的日期和时间设置:

OS X 语言和地区日期设置

许多不同的答案,所以我不妨把这种做法扔进戒指,

Sub test()
    Dim str As String
    Dim d As Variant
    str = "1/1/2016"
    d = CDate(Format(str, "dd/MM/yyyy"))
    Debug.Print d
End Sub

也许尝试在转换之前删除“/”? 我没有要测试的 Mac:

Public Sub test()
    Dim str As String
    Dim d As Long 'should be Date, but your question states Long
    str = "1/1/2016"
    d = CDate(Replace(str, "/", ""))
    Debug.Print d
End Sub

另外,您是否尝试过检查缺失的参考文献? VBA 的日期在 Excel 2011 中不起作用?

您可以使用 IsDate() 函数在转换之前检查它是否是日期。 否则使用解决方法:

Sub test()
    Dim str as string
    Dim d as variant
    str = "1/1/2016"

    If IsDate(str) then
       d = CDate(str)
    Else
       Dim aDateParts() as String
       aDateParts() = Split(str, "/")

       ' DateSerial(Year, Month, Day)
       d = DateSerial(CInt(aDateParts(2)), CInt(aDateParts(0)), CInt(aDateParts(1)))
    End If
end sub

我最初没有发布这个,因为我觉得它没有解决问题的根源,但是,如果你想要一个解决方法,你可以像使用CDate一样使用下面的函数,通过调用ConDate("12/12/2016")

这是我解决问题的方式:

Sub MainTest()
    Dim InputString As String, OutputDate As Date

    InputString = "01/12/2016"
    OutputDate = ConDate(InputString)

    Debug.Print OutputDate, TypeName(OutputDate)
End Sub

Function ConDate(ByRef InputString As String) As Date
    Dim Day As Long, Month As Long, year As Long
    'mmddyyyy format
    Month = CLng(Left(InputString, InStr(1, InputString, "/", vbTextCompare) - 1))
    Day = CLng(Mid(InputString, InStr(1, InputString, "/", vbTextCompare) + 1, InStrRev(InputString, "/", , vbTextCompare) - InStr(1, InputString, "/", vbTextCompare) - 1))
    year = CLng(Right(InputString, 4))
    ConDate = DateSerial(year, Month, Day)
End Function

不想剽窃 sebifeixler 的回答我保留了我原来的左/中/右来分隔日/月/年,但我觉得使用他的拆分功能用“/”分隔日期要简洁得多。 两者的结合将是一个很好的解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM