Excel VBA中日期格式不起作用

3

我在处理日期选择器的日期时遇到了一些困难。StartDate和EndDate是从DatePicker获取的值,Debug.Print会输出"mm/dd/yyyy"。我尝试将日期格式更改为"dd/mmm/yyyy",以便能够与我的MS Access数据进行比较。但是这并没有起作用。

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
@jainashish,我的短日期区域设置确实是M/d/yyyy,但我不能更改我的区域设置,因为该文件必须共享给多个用户。谢谢! - Aimee
你尝试过使用Application.International(xlDateOrder)获取最终用户的日期格式,然后相应地操作日期吗? - jainashish
4个回答

0
根据MSDN,Application.International(Index)方法返回有关当前国家/地区和国际设置的信息。
当您将索引应用为xlDateOrder时。
0 = month-day-year
1 = day-month-year
2 = year-month-day

因此,我们将使用这个属性来覆盖系统的行为。这在Excel-VBA项目在不同地理区域和个人区域设置下使用时特别有用。
以下是我稍作修改后的代码。格式化函数返回字符串,但你将其赋给了一个日期,这就导致了这个问题。
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

0

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"

0

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

  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

0

谢谢大家。我已经解决了,但我会投票给jainashish,因为它更接近于我如何使用结果来查询我的访问数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接