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

时间:2017-08-01 00:31:06

标签: vba excel-vba date-formatting excel

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

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

    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时,程序应该返回deadline_formatted = 12/05/2017,但它会返回deadline_formatted = 05/12/2017

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

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

仍会返回错误的格式。

任何人都可以建议:

  • 如何解决格式问题,将deadline_formatted格式化为dd / mm / yyyy格式 OR
  • 建议用“mm”翻转“dd”的“解决方法”(显然不是很理想,但是如果它有效,它就有效!)

感谢您的任何建议!

5 个答案:

答案 0 :(得分:2)

解决此问题的最佳方法是实际更改计算机的默认日期/时间格式以匹配用户使用的方法。 (在评论中说,用户是澳大利亚人,但你的公司是美国的,所以默认目前可能是美国的“mm / dd / yyyy”格式。)

通过确保计算机的日期/时间格式正确,它将允许您将日期作为日期处理,并且它可以作为日期存储在Excel单元格中,然后允许任何澳大利亚用户查看它显示为“dd / mm / yyyy”格式,而美国同事则将其显示为“mm / dd / yyyy”。

由于强迫用户使用不熟悉的日期系统与软件进行交互,导致公司面临财务风险,因为以错误的格式意外输入日期会导致下游出现重大错误,因此符合公司的最佳利益允许您将设置更改为与用户相关。

答案 1 :(得分:0)

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

有一个内置函数可以添加workdays。您可以包括/排除周末/假期。以下代码替换了您上面提到的代码。

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

答案 2 :(得分:0)

结果为String。

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")

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用此行,您不需要任何其他功能。

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