【问题标题】:Default date format setting in VBAVBA 中的默认日期格式设置
【发布时间】:2021-06-11 05:42:05
【问题描述】:

我最近更改了 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),但是我回来了,我得到的是 "06/11/2021"是 2021 年 11 月 6 日。

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

和 Excel 日期设置。

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

【问题讨论】:

  • What:=Format(dt_start, "dd/mm/yyyy") 搜索字符串,但如果您的日期是无效的实数日期,那么您需要搜索数值。将您的日期转换为双精度并搜索 What:=CDbl(dt_start)。数字日期以双精度形式保存在单元格中。其中数字是自1900-01-01 以来的天数,这样您可以使用日期计算并使用数字格式将它们格式化为您想要的任何外观。
  • 使用What:=DateSerial(2021,6,11) 根据年、月、日创建搜索日期:无论您的区域设置如何,这都是明确的。另外,您确定不想搜索LookIn:=xlValues
  • 这需要重复,因为它经常会导致问题:Excel 如何在内部存储单元格值和您在屏幕上看到的内容是两件不同的事情。正如@Pᴇʜ 所说,Excel 在内部将日期信息存储为一个数字:一个双精度数,其中整数部分表示日期,小数部分表示一天中的时间)。如果您想查看单元格中值的“原始”格式,请按 Ctrl-Shift-#,这将删除所有格式。 .NumberFormat 设置仅更改数据的显示方式,而不是存储方式。在图片中的 A4 单元格上执行此操作,以检查您是否有“真实”的 Excel 日期。

标签: excel vba


【解决方案1】:

这可能会有所帮助:

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

Application.International property (Excel)

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

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

【讨论】:

    【解决方案2】:

    在 VBA 中,日期和时间的表达式必须遵循 ISO 序列或“反向”美国格式。所以:

    Dim dt_start As Date
    ' dt_start = #11/6/2021# ' 06 Nov 2021
    dt_start = #6/11/2021#   ' 11 Jun 2021
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2017-08-23
      • 2015-06-29
      • 2014-05-14
      相关资源
      最近更新 更多