需要帮助了解Excel中的不同时间值

时间:2018-08-20 04:57:28

标签: excel excel-vba excel-formula

我通常会在Excel电子表格的时间字段列中获取数据,我需要将其转换为6、7、8等基本数字。

以下是我遇到的混乱情况的示例:

(注意:我无法更改数据的接收方式)

Time
-------------------------------
8am
10am
9:00 am (no early birds please)
8:00
9 a.m Sharp
7:00 am
8am-2pm
9 am
8AM TO 3PM
08-10-2018 9am
7:30am, 8:30 am
Any
9am
8AM TO 3PM
Today thru sun
10:00 a.m.

我最近运行了一些代码,该代码将从单元格中取出所有数字,然后删除除第一个数字之外的所有内容,该数字有些接近,但是...

最理想的情况是输出所需数字的代码,如果单元格数据不符合代码意图(错误),则将打开一个消息框,允许进行编辑,或者将单元格标记为彩色,所以我知道去哪里看。我最终得到了大约500行这些细胞以进行雪貂穿过。任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:0)

在考虑文本理解的同时,这是一个廉价而又肮脏的VBA函数,可能会占用大量的案例。我将结合条件格式实现此功能,条件格式突出显示大于或等于一或零的单元格。 (我的示例屏幕截图已采用了这种格式。)

Public Function GetDate(DateVal As String) As Date

Dim returnDate As Date    ' Date to be returned
Dim cleanedDate As String ' Working string containing the candidate date
Dim wordIndex As Integer  ' Counter for walking through the word array
Dim wordArray() As String ' Working string broken into words

' Initialize to zero date
returnDate = CDate(0)

If IsNumeric(DateVal) Then
    ' Handle dates already converted
    returnDate = CDate(DateVal)
Else
    ' Eliminate spurious characters
    cleanedDate = UCase(Replace(Replace(Replace(DateVal, ".", ""), ",", " "), "-", " "))

    If IsDate(cleanedDate) Then
        ' If CDate can fix it, just do that.
        returnDate = TimeValue(CDate(cleanedDate))
    Else
        wordArray() = Split(cleanedDate, " ")
        If UBound(wordArray) > 0 Then
            wordIndex = 0
            ' Look through each word and return the first time found
            Do Until returnDate > 0 Or wordIndex = UBound(wordArray)
                If IsDate(wordArray(wordIndex)) Then
                    returnDate = CDate(wordArray(wordIndex))
                End If
                wordIndex = wordIndex + 1
            Loop
        End If
    End If
End If

GetDate = returnDate

End Function

这是我在A列中得到的样本数据以及在B列中的=PERSONAL.XLSB!GetDate(A1)(或等价物)得到的结果:

Results of Running Function

请注意,第4、6和8行显示时间值。这是因为当我将示例数据粘贴到位时,Excel会转换值。该函数处理Excel自动转换的值。

修复代码中的第5行可能会比较棘手。您必须权衡该编码工作量与删除9点到凌晨

之间的空格这一简单的手动修复方法。

该代码可获取大约80%的示例案例。如果该比率适合您的总体数据,那么您正在考虑手动调整大约100个单元格。如果您定期执行此操作,请考虑进一步调整代码。最后一个沟渠工作可能是逐个字符地从左到右遍历字符串,以查看是否可以找到并构建时间字符串。

...或者,当然,您可以如上所述使用文本理解。 :-)

祝你好运!