2012-03-29 54 views
0

我想寫一個VBA函數來處理丟失的日期。轉換/格式丟失日期到完成日期

  • 12/2012
  • 07月04日(這是好事,沒有必要改變)

我需要:日期可以在我的Excel工作表中按如下方式輸入處理這樣的失蹤月/日期:

  • 2012 - > 01/01/2012
  • 12/2012 - > 2012年1月12日

而且,當輸入的日期應爲文本,而不是日期,因爲如果其格式爲日起,可以每年只進入轉換成一些奇怪的日期1900年一樣

回答

3
細胞

假設列A是文本格式,並且您給出的3種格式是唯一可能的。注意:如果A列中的單元格爲空,則公式會返回錯誤,但如果需要,它可以被修復。

A    B 
2012   =DATE(A1,1,1) 
12/2012  =DATE(RIGHT(A2,4),LEFT(A2,2),1) 
07/04/2012  =DATE(RIGHT(A3,4),LEFT(A3,2),MID(A3,4,2)) 
ANY FORMAT  =IF(LEN(A4)=4,DATE(A4,1,1),IF(LEN(A4)=7,DATE(RIGHT(A2,4),LEFT(A2,2),1),DATE(RIGHT(A3,4),LEFT(A3,2),MID(A3,4,2)))) 
+0

+1 NICELY DONE :) – 2012-03-29 10:01:44

+0

謝謝!看起來不錯,但我想要的是在VBA中使用它,而不是在Excel表中。我怎樣才能做到這一點? – Tal 2012-03-29 10:25:26

2

您可以使用DateSerial函數來構建如下所示的Date對象:DateSerial(year,month,day)。

爲了得到零件,在輸入字符串上使用split(splittring)(inputstring,「/」),然後可以使用返回的數組元素作爲構建塊,以便執行任何處理。

將其組合在一起......

Public Function DateFromString(inputString as String) as Date 
    Dim dateParts as String() 
    dateParts = Split(inputString, "/") 
    Dim year as Integer 
    Dim month as Integer 
    Dim day as Integer 

    If Ubound(dateParts) = 3 Then 
    month = dateParts(1) 
    day = dateParts(2) 
    year = dateParts(3) 
    Else If Ubound(dateParts) = 2 Then 
    day = dateParts(1) 
    year = dateParts(2) 
    Else If Ubound(dateParts) = 1 Then 
    year = dateParts(1) 
    End If 

    <check for missing date elements and provide values per business rules here...> 

    DateFromString = DateSerial(year, month, day) 
End Function 

我沒有測試此代碼,但它應該讓你在正確的方向。

+0

我認爲split有LBound = 0,所以你的條件分別是UBound = 2,1和0。 – assylias 2012-03-29 11:09:04