如何从VBA读取Windows桌面日期格式(适合传递给Format()函数)

时间:2014-10-27 23:07:50

标签: vba excel-vba excel

我正在调用Excel Range.Find方法:

http://msdn.microsoft.com/en-us/library/office/ff839746%28v=office.15%29.aspx

显然,如果搜索DATE,则必须以与正在运行的Windows桌面日期格式一致的格式传递日期值。

所以我在运行时需要做的是检测Windows的日期格式(dd / mm / yyyy vs mm / dd / yyyy等),这样我可以在调用Range.Find函数时使用它来格式化我的Date变量

如何从VBA中读取当前用户的Windows日期格式?

2 个答案:

答案 0 :(得分:1)

此功能适用于我使用各种日期配置运行Range.Find()的所有测试。我无法帮助感觉有更好的方法来做到这一点,因为这对于VBA开发人员自己想出来来说根本不是一个合理的解决方案......但这是微软和VBA。

Public Function WindowsShortFormattedDate(dt As Date) As String
    Dim sDay As String, sMonth As String, sYear As String, seperator As String
    seperator = Application.International(xlDateSeparator)
    sDay = IIf(Application.International(xlDayLeadingZero), Format(day(dt), "00"), Format(day(dt), "0"))
    sMonth = IIf(Application.International(xlMonthLeadingZero), Format(month(dt), "00"), Format(month(dt), "0"))    'it "seems" Excel never shows MMM even if thats what you've chosen under windows settings
    sYear = IIf(Application.International(xl4DigitYears), Format(year(dt), "0000"), Format(year(dt), "00"))
    Select Case Application.International(xlDateOrder)
        Case 0 'month-day-year
            WindowsShortFormattedDate = sMonth & seperator & sDay & seperator & sYear
        Case 1 'day - month - year
            WindowsShortFormattedDate = sDay & seperator & sMonth & seperator & sYear
        Case 2 'year - month - day
            WindowsShortFormattedDate = sYear & seperator & sMonth & seperator & sDay
        Case Else
            err.Raise -999, "WindowsShortFormattedDate", "Unanticipated xlDateOrder"
    End Select
End Function

答案 1 :(得分:0)

如果:

Sub DateFormatTest()
    MsgBox Left(DateSerial(2000, 12, 25), 2)
End Sub

显示 12 ,然后格式为mm / dd / yyyy
显示 25 ,然后格式为dd / mm / yyyy

另一种方法是通过 Application.International 来解决这个问题。在美好的一天,这是痛苦的。