将日期格式从 mm/dd/yyyy 更改为 dd/mm/yyyy VBA

changing date fromat from mm/dd/yyyy to dd/mm/yyyy VBA

所以我知道这个问题已经被问过几次了,但我相信我的情况有点不同(当然很高兴被证明是错误的!)

这是数据流:用户在表单的日期中键入日期。然后他们点击一个按钮。然后我的宏采用该日期,通过以下函数运行它:

    Function AddWeekDays(StartDate As Long, Days As Long) As Date
    Dim i As Long
    Dim d As Date

    d = StartDate
    i = 0

    While i < Days
        d = DateSerial(Year(d), Month(d), Day(d) + 1)
        If Weekday(d, vbMonday) < 6 Then
            i = i + 1
        End If
    Wend

    AddWeekDays = d
End Function

然后按以下方式格式化日期以将其从 mm/dd/yyyy 更改为 dd/mm/yyyy:

Dim deadline As Date
Dim deadline_formatted As Date
Dim DateReceived As String
Dim DateConverted As Date
DateReceived = txt_DateReceived.Text
DateConverted = Format(DateReceived, "dd/mm/yyyy")
deadline = AddWeekDays(DateValue((CStr(DateConverted))), 9)
deadline_formatted = Format(deadline, "dd/mm/yyyy")

然而,deadline_formatted 值仍然以 mm/dd/yyyy 格式出现。

例如,当用户输入 01/05/2017 时,程序应该 return deadline_formatted = 12/05/2017,但它 returns deadline_formatted = 05/12/2017

我尝试将变量类型更改为字符串以查看是否有所不同(没有),并尝试使用以下代码直接将截止日期变量转换为所需格式:

deadline = Format(AddWeekDays(DateValue((CStr(DateConverted))), 9),"dd/mm/yyyy")

仍然 return 格式不正确。

有人可以提出建议吗:

感谢任何建议!

它与您的问题没有直接关系,但我相信它可能会解决您的问题。手动计算添加工作日可能是这里的问题。

有一个内置函数可以添加 workdays。你可以 include/exclude weekends/holidays。以下代码替换您上面提到的代码。

Sub AddWeekDays()
    Dim deadline As Date, deadline_formatted As Date
    deadline = txt_DateReceived.Value
    deadline_formatted = Format(Application.WorksheetFunction.WorkDay(deadline, 9), "dd/mm/yyyy")
    'debug.print deadline_formatted
End Sub

解决此问题的最佳方法是实际更改计算机的默认 date/time 格式以匹配用户使用的方法。 (在评论中指出用户是澳大利亚人,但您的公司位于美国,因此目前默认设置可能是美国的 "mm/dd/yyyy" 格式。)

通过确保计算机 date/time 格式正确,它允许您将日期作为日期处理,并且它可以作为日期存储在 Excel 单元格中,然后允许任何澳大利亚用户都会看到它显示为 "dd/mm/yyyy" 格式,而美国同事会看到它显示为 "mm/dd/yyyy".

强制用户与使用不熟悉的日期系统的软件交互会给贵公司带来财务风险,因为意外输入错误格式的日期可能会导致下游出现重大错误,因此这是公司最好的选择有兴趣允许您更改与用户相关的设置。

结果为字符串。

Dim deadline As Date
Dim deadline_formatted As String '<~~ change string
Dim DateReceived As String
Dim DateConverted As Date

txt_DateReceived = "01/05/2017"

DateReceived = txt_DateReceived
DateConverted = Format(DateReceived, "dd/mm/yyyy")
'deadline = AddWeekDays(DateValue((CStr(DateConverted))), 9)
deadline = AddWeekDays(CLng(DateConverted), 9) '<~~ change Long
deadline_formatted = Format(deadline, "dd/mm/yyyy")

我不会在意区域设置。相反,请确保所有日期都被捕获为 Date() 或 Now() 值(42123 或 42123.5555)。在输出端,这些值可以以您希望的任何格式显示。 为确保正确输入日期,我首选的方法是使用日期选择器。如果无法做到这一点,则根本不制定输入日期的规则,假设每个用户都知道如何在 his/her 机器上输入日期。添加日期检查,如 ISDATE(),它将捕获一些输入错误,但不是全部。你不需要抓住所有。你只需要教用户如何在他们各自的电脑上输入日期。

有了这条线,你不需要任何其他东西。

Range("E:E").TextToColumns FieldInfo:=Array(0, xlDMYFormat)
'1.2.2019 -> 01/02/2019
'2,3,2019 -> 02/03/2019
'3-4-2019 -> 03/04/2019
'4*5*2019 -> 04/05/2019
'5_-6-*2019 -> 05/06/2019
'and so on

当然你可以用

改变格式
xlMDYFormat