首页 > 解决方案 > VBA 中的默认日期格式设置

问题描述

我最近在 Win 10 上更改了我的区域设置,这影响了我的 VBA 宏解释日期的方式,并且我Range.Find() 停止了正常工作。下面是用于返回日期行的简单宏示例。


Sub a()
Dim dt_start As Date
dt_start = #11/6/2021# ' 11 Jun 2021
Dim rDateColumn As Range
Set rDateColumn = ThisWorkbook.Worksheets("2").Range("A:A")
rDateColumn.NumberFormat = "dd/mm/yyyy"

w = rDateColumn.Find(What:=Format(dt_start, "dd/mm/yyyy"), _
    LookIn:=xlFormulas, _
    LookAt:=xlWhole, _
    SearchOrder:=xlByRows).Row

End Sub

当我尝试运行它时它会返回 Run-time error '91':。我也试过这段代码 lookIn:=xlValues

即使我将日期格式设置为“dd/mm/yyyy”,VBA 仍将其读取为“mm/dd/yyyy”。请参见下面的屏幕截图。

在此处输入图像描述

我尝试将 dt_start 转换为字符串 (Format(dt_start, "dd/mm/yyyy"),然后返回日期 DateValue(str_date),但是我回来了,我得到的是 11 月 6 日的“06/11/2021” 2021 年。

以下是我的系统区域设置:

在此处输入图像描述

和 Excel 日期设置。

Excel

非常感谢任何信息。谢谢!

标签: excelvba

解决方案


这可能会有所帮助:

Sub a()
    'First get the date order (format) from the system.
    Dim myFormatDate As String
    Dim i: i = Application.International(xlDateOrder)
    'xlDateOrder Long
    'Order of date elements:
    '0 = month-day-year,
    '1 = day-month-year,
    '2 = year-month-day
    
    If i = 0 Then
        myFormatDate = "m/d/yyyy" 'NOT mm/dd/yyyy! will give you 00/00/000 not the same in strings.
    ElseIf i = 1 Then
        myFormatDate = "d/m/yyyy"
    ElseIf i = 2 Then
        myFormatDate = "yyyy/m/d"
    End If
    
    Dim dt_start As Date
        'dt_start = #11/6/2021# ' 11 Jun 2021
        'Never trust this... Now you know why!
    
    'Let us built!
    Dim DD: DD = 6
    Dim MM: MM = 11
    Dim YYYY: YYYY = 2021
    Dim w
    dt_start = DateSerial(YYYY, MM, DD)
    'Better to built the var-date using DateSerial
    'Now you have a date and you have the control!
    
    'Dim strDate As String: strDate = Format(dt_start, myFormatDate)
    'the line above is optional, if you want to use instead
    'of: Format(dt_start, myFormatDate)
    'This way: What:=strDate.
    
    Dim rDateColumn As Range
    Set rDateColumn = ThisWorkbook.Worksheets("2").Range("A:A")
    rDateColumn.NumberFormat = "dd/mm/yyyy"
    w = rDateColumn.Find(What:=Format(dt_start, myFormatDate), _
        LookIn:=xlFormulas, _
        LookAt:=xlWhole, _
        SearchOrder:=xlByRows).Row
End Sub

申请.国际财产 (Excel)

返回有关当前国家/地区和国际设置的信息。只读变体。

xlDateOrder:日期元素的顺序:0 = 月-日-年,1 = 日-月-年,2 = 年-月-日


推荐阅读