2017-02-27 50 views
0

所以我在我的专栏中混淆了日期信息。例如Jan预先计划2017年,Feb计划后2017年低等。如何从文本输出日期值

两件事总是一致的:几个月总是以3个字母开头。而一年来的4个数字(可以在任何地方。)

基本上,我需要他们在标准日期格式(例如2017年1月1日,2017年1月2日等)

+0

这不是一个标准的日期形式 - 你是要求做'm.d.yyyy'还是'd.m.yyyy'? – Siyual

+0

另外,侧面的问题,但你为什么要存储像这样开始的数据?这是非常适得其反的。如果你将'date'的值存储为一个实际的'date'数据类型,那么你就不会遇到这个问题。 – Siyual

+1

'我基本上需要它们的标准日期形式:1.1.2017,1.2.2017' <=否,这也是一个坏主意,*几乎与以这种格式将它们存储为以*开头的想法一样糟糕。您应该将它们作为实际的“日期”或“日期时间”类型进行存储和检索。有一个很好的理由是有一个类型系统开始,否则一切都只是一个字符串。日期是日期,而不是字符串。 – Igor

回答

1

首先转换您的字符串为日期值:

s = "Jan preplan-2017" 
TrueDate = DateValue("1 " & Left(s, 3) & " " & Right(s, 4)) 

然后 - 显示 - 格式要求:

ShowDate = Format(TrueDate, "d.m.yyyy") 

或者一气呵成:

ShowDate = Format(DateValue("1 " & Left(s, 3) & " " & Right(s, 4)), "d.m.yyyy") 

编辑:使用拆分创建的元素,这些循环的数组,并挑选一个是一个整数:

Year = Split("Feb-afterplan-2017-low", "-")(2) 
+0

左()作品完美!但Right()的问题在于,这一年也可能出现在中间。如果我可以过滤我们的非数字,那么将工作 –

+1

哦,那么你将不得不以某种方式剥离它。它是否总是带有前导或尾随短划线:'“ - ”'? – Gustav

+0

是的!嗯,我从来没有想过通过该工作 –

0

我不是辉煌与正则表达式那么无疑这可以改善。

作为一个工作表函数:

Public Function ConvertDate(sData As String) As Variant 
    Dim RE As Object, REMatches As Object 
    Dim Temp As String 

    Set RE = CreateObject("vbscript.regexp") 
    With RE 
     .MultiLine = False 
     .Global = False 
     .IgnoreCase = True 
     .Pattern = "\d{4}" 
    End With 

    Set REMatches = RE.Execute(sData) 
    If REMatches.Count > 0 Then 
     Temp = "1-" & Left(sData, 3) & "-" & REMatches(0) 
     ConvertDate = CDate(DateValue(Temp)) 
    Else 
     'Returns #VALUE error on no match. 
     ConvertDate = CVErr(xlValue) 
    End If 
End Function 

按引用传递日期和返回TRUE/FALSE:

Public Sub Test() 

    Dim MyDate As Date 

    If ConvertDate1("Jan preplan-2017", MyDate) Then 
     MsgBox "Date converted to " & Format(MyDate, "dd-mmm-yy"), vbOKOnly 
    Else 
     MsgBox "Date not converted.", vbOKOnly 
    End If 

End Sub 

Public Function ConvertDate1(sData As String, ByRef ReturnValue As Date) As Boolean 
    Dim RE As Object, REMatches As Object 
    Dim Temp As String 

    Set RE = CreateObject("vbscript.regexp") 
    With RE 
     .MultiLine = False 
     .Global = False 
     .IgnoreCase = True 
     .Pattern = "\d{4}" 
    End With 

    Set REMatches = RE.Execute(sData) 
    If REMatches.Count > 0 Then 
     Temp = "1-" & Left(sData, 3) & "-" & REMatches(0) 
     ReturnValue = CDate(DateValue(Temp)) 
     ConvertDate1 = True 
    Else 
     ConvertDate1 = False 
    End If 
End Function 

正则表达式,可以提高检查前三个字母是一个月...负荷可以做些改进,但你可以得到我希望的照片。

相关问题