【问题标题】:Date Format not working in excel vba日期格式在excel vba中不起作用
【发布时间】:2018-06-13 08:43:40
【问题描述】:

我的日期选择器日期有些困难。 StartDate 和 EndDate 是来自 DatePicker 的值,Debug.Print 会给我“mm/dd/yyyy”。我正在尝试将日期格式更改为“dd/mmm/yyyy”,以便能够将其与来自 MS 访问的数据进行比较。但它不起作用。

Sub cmdSubmit_Click()
    Dim StartDate As Date, EndDate As Date

    StartDate = DTPickStart.Value    ' 6/11/2018
    EndDate = DTPickEnd.Value        ' 6/24/2018

    StartDate = Format(StartDate, "dd/mmm/yyyy")
    EndDate = Format(EndDate, "dd/mmm/yyyy")

    Debug.Print StartDate           ' gave me 6/11/2018 instead of 11/Jun/2018
    Debug.Print EndDate
End Sub

关于我在这里做错了什么有什么建议吗?

提前致谢!

【问题讨论】:

  • 这是 Excel 中的一个已知问题。通常,它与系统的区域设置有关。默认情况下,Excel 从那里选择日期。检查您的区域设置,日期格式将是 mm/dd/yyyy。
  • @jainashish,我的短日期区域设置确实是 M/d/yyyy,但我无法更改我的区域设置,因为该文件必须共享给多个用户。谢谢!
  • 您是否尝试过 Application.International(xlDateOrder) 来获取最终用户日期格式,然后相应地操作日期?

标签: excel date-formatting vba


【解决方案1】:

根据MSDN Application.International(Index) 方法返回有关当前国家/地区和国际设置的信息。

当您将索引应用为 xlDateOrder 时

0 = month-day-year
1 = day-month-year
2 = year-month-day

因此,我们将使用此属性来覆盖系统行为。当 Excel-VBA 项目在具有各种单独区域设置的地理区域中使用时,这尤其有用。

下面,我正在重新编写您的代码并稍作调整。 Format 函数返回字符串,但您将其分配给导致此问题的日期。

Sub cmdSubmit_Click()
    Dim StartDate As Date, EndDate As Date
    Dim strStartDate as String, strEndDate as String

    StartDate = DTPickStart.Value    ' 6/11/2018
    EndDate = DTPickEnd.Value        ' 6/24/2018

    strStartDate = Format(StartDate, "dd/mmm/yyyy")
    strEndDate = Format(EndDate, "dd/mmm/yyyy")

    Debug.Print StartDate           ' It will give 11/Jun/2018
    Debug.Print EndDate
End Sub

【讨论】:

    【解决方案2】:

    Format 可能会以您想要的格式返回日期,但随后会将其转换为日期值,然后以系统的默认格式打印。要将它们以您想要的格式存储,您可以尝试以下操作:

    Option Explicit
    
    Sub cmdSubmit_Click()
        Dim StartDate As Date, EndDate As Date
        Dim s1 As String, s2 As String
    
        StartDate = #6/11/2018#
        EndDate = #6/24/2018#
    
        'StartDate = Format(StartDate, "dd/mmm/yyyy")
        'EndDate = Format(EndDate, "dd/mmm/yyyy")
    
        s1 = Format(StartDate, "dd/mmm/yyyy")
        s2 = Format(EndDate, "dd/mmm/yyyy")
    
        Debug.Print StartDate & " - " & s1          ' gave me 6/11/2018 instead of 11/Jun/2018
        Debug.Print EndDate & " - " & s2
    End Sub
    

    或者,如果您希望它们在单元格中作为日期,您可以将写入它们的范围的NumberFormat 设置为您想要的格式:

    Sheet1.Range("A1") = StartDate
    Sheet1.Range("A2") = EndDate
    Sheet1.Range("A1:A2").NumberFormat = "dd.mmm.yyyy"
    

    【讨论】:

      【解决方案3】:

      如果您需要在 VBA 中格式化日期,您有 2 个选项:

      1. 更改区域设置;
      2. 写入 Excel,格式化并带上.Text

      Option Explicit
      
      Sub TestMe()
      
          Dim StartDate As Date
      
          StartDate = #6/11/2018#
          Cells(1, 1) = StartDate
          Cells(1, 1).NumberFormat = "DD/MMM/YYYY"
          Debug.Print Cells(1, 1).Text '11.Jun.2018
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        谢谢大家。我设法弄清楚了,但我投票给了 jainashish,因为它更接近于我如何使用结果来查询我的访问数据库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-17
          • 2015-08-31
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          相关资源
          最近更新 更多