我通常会在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行这些细胞以进行雪貂穿过。任何建议,将不胜感激。
答案 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)
(或等价物)得到的结果:
请注意,第4、6和8行显示时间值。这是因为当我将示例数据粘贴到位时,Excel会转换值。该函数处理Excel自动转换的值。
修复代码中的第5行可能会比较棘手。您必须权衡该编码工作量与删除9点到凌晨
之间的空格这一简单的手动修复方法。该代码可获取大约80%的示例案例。如果该比率适合您的总体数据,那么您正在考虑手动调整大约100个单元格。如果您定期执行此操作,请考虑进一步调整代码。最后一个沟渠工作可能是逐个字符地从左到右遍历字符串,以查看是否可以找到并构建时间字符串。
...或者,当然,您可以如上所述使用文本理解。 :-)
祝你好运!