如何通过vba将文本转换为日期和时间总和?

时间:2014-11-10 18:38:51

标签: excel vba excel-vba

你好吗?看,我打开一个制表符分隔的文件,其中包含有关分析样本的日期和时间的信息。我想以一种可以根据这些信息对行进行排序的方式来总结时间和日期。

时间和日期作为字符串存储在两个不同的单元格中,如: 日期:2013年11月29日 13:41:59:546

因此,我必须创建一个公式来删除“Date:”并将“:546”转换为毫秒并添加到数字的其余部分。不幸的是,即使删除“日期:”,我也无法将“29/11/2013”​​转换为数字,因为日期被excel解释为数字。这很有趣,因为打开工作簿,如果我选择了29/11/2013的单元格(在删除“Date:”之后)并按F2,则输入,excel将其转换为数字。当我试图通过vba做同样的事情时,我错过了什么吗?

我的结果应该是具有适当格式的数字

.numberformat="dd/mm/yyyy hh:mm:ss.000"

应显示29/11/2013 13:41:59.546。

我的功能是:

Function DateTimeCustomFormat(TimeCell As Range, DateCell As Range, formatTime As String, formatDate As String)

    Dim ms As Double 'Means milliseconds
    Dim msTOday As Long 'Factor to convert ms to day (ms divided by all milliseconds in a day)

    msTOday = 86400000

    Select Case formatTime

        Case "hh:mm:ss:ms(xxx)"

            ms = Val(Right(TimeCell, 3)) / msTOday
                TimeCell = Left(TimeCell, Len(TimeCell) - 4) 
                    TimeCell.NumberFormat = "0.00" '"h:mm:ss.000"
                        TimeCell = TimeCell + ms

    End Select

        Select Case formatDate

        Case "Date: dd/mm/yyyy"

                DateCell = Right(DateCell, Len(DateCell) - 6)
                    DateCell.NumberFormat = "dd:mm:aaaa"
                        'DateCell = DateCell.Value * 1

    End Select

        DateTimeCustomFormat = TimeCell + DateCell


End Function

1 个答案:

答案 0 :(得分:1)

看起来好像你并不熟悉对象数据类型,例如Range,用户定义的函数可以做什么以及什么不做。

在您的代码中,您将参数TimeCell作为Range获取,然后用字符串(TimeCell = Left(TimeCell, Len(TimeCell) - 4))覆盖它,然后尝试将NumberFormat设置为此值。字符串没有NumberFormat ;-)。此外,如果这是上述代码行的目标,则用户定义的函数不能将NumberFormat设置为单元格,也不能设置单元格值。它只能返回一个值。然后,该值获取单元格的值,其中包含用户定义的函数作为公式。

与DateCell相同的问题。

您的代码应该获取单元格值的部分,这些值表示时间或日期为字符串,然后将它们转换为日期。因此,一些功能是可用的。

易于使用的是TimeValue和DateValue。但这些功能取决于日期和时间格式的系统设置。所以可能他们没有获得正确的价值观。对于日期,例如" 06/07 / 2014"如果是7月06日或6月07日,那就不太清楚了。这取决于系统日期格式设置。

更通用的解决方案是使用TimeSerial和DateSerial。在我看来,这是更好的解决方案,因为甲酸盐是精确定义的。

Function DateTimeCustomFormat(TimeCell As Range, DateCell As Range, formatTime As String, formatDate As String) As Date

    Dim ms As Double 'Means milliseconds
    Dim msTOday As Long 'Factor to convert ms to day (ms divided by all milliseconds in a day)
    Dim sTime As String, sDate As String 'String parts of the given parameters
    Dim dTime As Date, dDate As Date 'Calculated datetime values of the given parameters

    msTOday = 86400000

    Select Case formatTime
        Case "hh:mm:ss:ms(xxx)"
            ms = Val(Right(TimeCell.Value, 3)) / msTOday
            sTime = Left(TimeCell.Value, Len(TimeCell.Value) - 4)
            'dTime = TimeValue(sTime) + ms 'please read help for TimeValue
            dTime = TimeSerial(Left(sTime, 2), Mid(sTime, 4, 2), Mid(sTime, 7, 2)) + ms
        Case Else
            dTime = 0
    End Select

    Select Case formatDate
        Case "Date: dd/mm/yyyy"
            sDate = Right(DateCell.Value, Len(DateCell.Value) - 6)
            'dDate = DateValue(sDate) 'please read help for DateValue
            dDate = DateSerial(Right(sDate, 4), Mid(sDate, 4, 2), Left(sDate, 2))
        Case Else
            dDate = 0
    End Select

    DateTimeCustomFormat = dTime + dDate

End Function

用作UDF(用户定义的函数): enter image description here