2017-08-01 182 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上輸入日期。