2017-08-01 183 views
0

所以我知道这个问题已经被问了几次,但我相信我的情况有点不同(当然很高兴被证明是错误的!)更改日期fromat从mm/dd/yyyy到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 

然后格式化日期从毫米更改/ 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格式显示。

作为一个例子,当用户进入2017年1月5日的程序应返回deadline_formatted = 12/05/2017,但它返回deadline_formatted = 05/12/2017

我试图改变变量类型为字符串,看看是否能取得的差(它没“T),并试图通过使用下面的代码直接的截止日期变量转换为所需的格式:

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

其仍返回不正确的格式。

任何人可以在那里提出的或者是:

  • 如何修正格式问题以获得deadline_formatted到格式DD/MM/YYYY 或
  • 提出了“变通方法”翻转“DD “与”毫米“(不理想显然,但如果它的工作,它的工作!)

感谢您的任何意见!

+0

https://www.ablebits.com/office-addins-blog/2015/03/11/change-date-format-excel/ –

+0

'deadline_formatted'是'Date',而不是'String',所以它没有以任何特定的方式“格式化”(它仅仅是数字42867)。 – YowE3K

+1

用户通常在计算机上使用什么日期格式?说实话,我不知道你为什么要改变这种格式 - 你应该让他们以他们习惯的任何格式输入日期,然后将日期存储在Excel单元格中(如果这是它的位置去)作为日期。这样,无论用户在工作簿中看到日期,都能以任何格式查看日期,并且基于日期的任何计算都能正常工作,而无需进行各种奇怪的调整,以便从一种语言环境转换为另一种语言环境。 – YowE3K

回答

1

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

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

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

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

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