【问题标题】:VBA Convert String to DateVBA 将字符串转换为日期
【发布时间】:2015-03-03 05:10:28
【问题描述】:

我在 Excel 工作表中有以下格式的数据:

项目代码 交货日期 5456987 24.01.2009 5456988 5456989 12.24.2009 5456990 2009 年 12 月 24 日

我已将 DeliveryDate 的值存储在一个数组中。我需要对日期的基础做出决定,然后将结果打印在新的工作表中。所以我必须将值转换为数组:

Dim current as Date, highest as Date, result() as Date
For Each itemDate in DeliveryDateArray
    current = CDate(itemDate)
    if current > highest then
         highest = current
    end if
    ' some more operations an put dates into result array
Next itemDate
'After activating final sheet...
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result)

不幸的是,CDate() 函数抛出错误:

运行时错误“13”:

类型不匹配

VBA 中是否有一个函数可以:

  • 任何日期格式解析字符串并返回一个日期对象来处理。
  • 如果字符串为空或格式错误(用于循环比较),则返回空日期对象。

编辑:

要重现错误,只需运行 myDate = CDate("24.01.2009")

【问题讨论】:

  • 根据这个网站 [example-code.com/vb/stringtodate.asp] 你做得对..它在哪里抛出错误?在哪一行——第一行还是第二行(空字符串)?您是否尝试过更改字符串格式?您可能希望更改在那里解析日期字符串的格式。 “24.01.2009”可能无法识别,但“12/24/2009”可能 - 尝试仅转换 12/24/2009 并查看它是否有效。如果它确实有效,那么 24.01.2009 格式可能是不可接受的。
  • 尝试转换 12/24/2009 看看它是否有效。如果它确实有效,那么 dd.MM.yyyy 格式对于 CDate 可能是不可接受的。您可能有一种方法可以指定它的格式,以便它可以完全按照您想要的方式解析它。如果 dd.MM.yyyy 格式是导致问题的原因,请先更改格式,例如替换“。”使用“/”并尝试再次转换它。或将其格式化为 MM/dd/yyyy 然后转换。我想我只是想知道“12/24/2009”是否会出错。先检查并告诉我。
  • @AnnB.,我的第一个问题是;是否有一个 VBA 函数可以解析 any 日期格式的字符串并返回要使用的日期对象?
  • @JasonWilliams 不,没有。不可能知道所有的日期格式。
  • @Deanna,我使用 Replace 函数来交换 '.' '/' 然后使用 CDate 转换日期。谢谢(你的)信息。 :)

标签: vba excel vb6


【解决方案1】:

尝试使用Replace 看看它是否适合您。正如我所看到的,上面已经提到过几次的问题是 CDate 函数在周期上阻塞。您可以使用替换将它们更改为斜线。要回答您关于 vba 中可以解析任何日期格式的函数的问题,您没有任何非常有限的选项。

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray
    Dim tempDate As String
    itemDate = IIf(Trim(itemDate) = "", "0", itemDate) 'Added per OP's request.
    tempDate = Replace(itemDate, ".", "/")
    current = Format(CDate(tempDate),"dd/mm/yyyy")
    if current > highest then 
        highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 

【讨论】:

  • @JasonWilliams 我会将其添加到答案中,您确定要使用“0”吗?它默认为时间(上午 12:00:00)而不是日期。
【解决方案2】:

看起来它可能会在空数据行上引发错误,您是否尝试在运行 CDate() 函数之前确保 itemDate 不为空?我想这可能是你的问题。

【讨论】:

  • 好的。当您将数据放在那里时,这会很有用。
  • 您是否检查过 CDate() 所需的格式,如果您没有similar thread,这可能很有用。从外观上看,您可能需要重新格式化您传入的日期。
【解决方案3】:

我使用了这个代码:

ws.Range("A:A").FormulaR1C1 = "=DATEVALUE(RC[1])"

A 列将是 mm/dd/yyyy

RC[1] 是 B 列,TEXT 字符串,例如 01/30/12,这不是 DATE TYPE

【讨论】:

  • 这并不能真正回答问题。他们试图解析 dd.mm.yyyy,这不是由 VB/VBA/Excel 函数本机处理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2014-09-12
  • 2011-11-28
相关资源
最近更新 更多