【发布时间】:2018-05-20 02:30:51
【问题描述】:
我的 Excel 电子表格中有这个 VBA 模块,它试图清理日期数据,其中包含文本与日期信息结合的各种问题。这是我的主要加载功能:
Public lstrow As Long, strDate As Variant, stredate As Variant
Sub importbuild()
lstrow = Worksheets("Data").Range("G" & Rows.Count).End(xlUp).Row
Function DateOnlyLoad(col As String, col2 As String, colcode As String)
Dim i As Long, j As Long, k As Long
j = Worksheets("CI").Range("A" & Rows.Count).End(xlUp).Row + 1
k = Worksheets("Error").Range("A" & Rows.Count).End(xlUp).Row + 1
For i = 2 To lstrow
strDate = spacedate(Worksheets("Data").Range(col & i).Value)
stredate = spacedate(Worksheets("Data").Range(col2 & i).Value)
If (Len(strDate) = 0 And (col2 = "NA" Or Len(stredate) = 0)) Or InStr(1,
UCase(Worksheets("Data").Range(col & i).Value), "EXP") > 0 Then
GoTo EmptyRange
Else
Worksheets("CI").Range("A" & j & ":C" & j).Value =
Worksheets("Data").Range("F" & i & ":H" & i).Value
Worksheets("CI").Range("D" & j).Value = colcode
Worksheets("CI").Range("E" & j).Value = datecleanup(strDate)
'Worksheets("CI").Range("L" & j).Value = dateclean(strDate)
Worksheets("CI").Range("F" & j).Value = strDate
If col2 <> "NA" Then
If IsEmpty(stredate) = False Then
Worksheets("CI").Range("F" & j).Value = datecleanup(stredate)
End If
End If
j = j + 1
End If
EmptyRange:
Next i
End Function
日期清理功能:
Function datecleanup(inputdate As Variant) As Variant
If Len(inputdate) = 0 Then
inputdate = "01/01/1901"
Else
If Len(inputdate) = 4 Then
inputdate = "01/01/" & inputdate
Else
If InStr(1, inputdate, ".") Then
inputdate = Replace(inputdate, ".", "/")
End If
End If
End If
datecleanup = Split(inputdate, Chr(32))(0)
样本输出:
Column A Column B Column C Column D Column E Column F
125156 Wills, C 11/8/1960 MMR1 MUMPS MUMPS TITER 02/26/2008 POSITIVE
291264 Balti, L 09/10/1981 MMR1 (blank) Measles - 11/10/71 Rubella
943729 Barnes, B 10/10/1965 MMR1 MUMPS MUMPS TITER 10/08/2008 POSITIVE
Split 将日期与后续文本分开,这可以正常工作,但是如果有文本出现在日期之前,则输出包含文本的第一部分。我只想从字符串中获取日期(如果存在)并显示它,而不管它在字符串中的哪个位置。以下是示例结果:E 列是拆分逻辑的输出,F 列是正在从另一个工作表评估的整个字符串。
上述示例的所需输出:(E 列提取了正确的日期)
Column A Column B Column C Column D Column E Column F
125156 Wills, C 11/8/1960 MMR1 02/26/2008 MUMPS TITER 02/26/2008 POSITIVE
291264 Balti, L 09/10/1981 MMR1 11/10/71 Measles - 11/10/71 Rubella
943729 Barnes, B 10/10/1965 MMR1 10/08/2008 MUMPS TITER 10/08/2008 POSITIVE
我还可以在 datecleanup 函数中添加什么来进一步完善它?提前致谢!
【问题讨论】:
-
循环拆分的输出并使用
isdate()查找日期,如果为真则返回该日期。 -
日期是否总是/*/格式?
-
@RicardoA 日期将采用 M/DD/YYYY 或 MM/DD/YYYY 格式,例如2015 年 7 月 16 日、2015 年 7 月 15 日、2015 年 12 月 5 日