将缺失日期转换/格式化为完成日期

时间:2012-03-29 09:47:09

标签: excel vba date excel-vba

我正在尝试编写一个VBA函数来处理缺少的日期。日期可以在我的Excel工作表中输入,如下所示:

  • 2012
  • 二千零十二分之十二
  • 07/04/2012(这很好,无需更改)

我需要像这样处理丢失的月份/日期:

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

此外,输入日期的单元格应该是文本而不是日期,因为如果格式化为日期,它可以将仅年份的条目转换为某个奇怪的日期,如1900.

2 个答案:

答案 0 :(得分: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))))

答案 1 :(得分:2)

您可以使用DateSerial函数构建如下日期对象:DateSerial(年,月,日)。

为了获取部件,在输入字符串上使用拆分(如Split(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

我没有测试过这段代码,但它应该让你指向正确的方向。