2012-03-29 53 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