所以我知道这个问题曾被问过几次,但我相信我的情况有点不同(当然很高兴被证明是错误的!)
以下是数据流:用户在表单中的日期中键入日期。然后他们点击一个按钮。然后我的宏接受该日期,通过以下函数运行它:
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")
仍会返回错误的格式。
任何人都可以建议:
感谢您的任何建议!
答案 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