我有一个包含大约 60,000 条记录的数据集。拖欠日期字段就在处理货币值的字段之后,有时用户会在拖欠日期字段中意外输入货币值。此外,他们有时将日期输入为字符串(2011 年 8 月 2 日)或拖欠天数(135 或 135 天)。最常见的输入方法是 mm/dd/yy 格式 (08/02/11)。
可悲的是,这个系统的程序员拒绝花时间为这个字段创建验证,所以我必须在获得数据后尽可能多地执行它。通常,我会用一些简单的公式来处理这个问题,但是,用户输入数据的方式有 19 种不同的方式,我需要能够快速处理每一种方式。将列加载到数组中似乎是最好的选择。
我的想法是将列加载到一个数组中,循环遍历它,处理所有条目选项(或删除完全混乱的选项),然后将其写回工作表。我知道数据类型是下面数组的第一个问题,但我之前在 Excel VB 中只使用过一次数组,我不太确定我做错了什么。第三行代码是第一个问题。谢谢你的帮助。
根据 BRTTDJ 的评论的工作代码
'Perform housekeeping on delinquency date
Dim delinquency()
delinquency = Application.Transpose(Range("AH1:AH" & importwsRowCount))
For i = LBound(delinquency) To UBound(delinquency)
If InStr(delinquency(i), ".") Then
delinquency(i) = Empty
Debug.Print "Emptied an array element at row " & i + 1
End If
'Additional string or numeric operations here to reformat bad entries.
Next i
Set delRange = Range("AJ1:AJ" & importwsRowCount)
iWS.names.Add Name:="dRange", RefersTo:=delRange
delinquency = Application.Transpose(delinquency) 'Transpose rows and columns
Range("dRange").Value = delinquency 'Write array to worksheet
需要重新格式化的不良条目示例
9 月。25, 20(没有年份,没有年份!删除。)
SEPT(没有年份,没用,删除。)
N/A(垃圾!删除。)
LONG TIME AG(傻瓜认为这是个好主意,删除。)
6 月 30 日, 200(显然该字段只能保存 12 个字符,删除。)
CHARGED OFF(无用,删除。)
94 DAYS(取空格前面的所有字符并从包含订单日期的其他字段中减去以获得拖欠日期。)
94 DPD(DPD in某人聪明的头脑代表我相信过期的日子。同上。)
2008-7-15 12(不确定额外的数字是多少,取空格前的所有字符并转换。)
无效(删除。)
空白(什么都不做。)
12282009(使用嵌套的 LEFT 和 RIGHT 和 CONCATENATE 与 / 之间。)
9202011(添加前导零,然后与上面相同。)
92410(添加前导零,这将转换为 09/ 24/10)
41261(自 1899 年 12 月 31 日以来的天数,这将转换为 12/08/12)
1023(自拖欠的天数,从 ORDER DATE 中减去以获得拖欠日期。)
452(同上。)
12(同同上。)
1432.84(货币价值,低智商走狗误入。删除。)
更新的代码,包括删除错误条目(正在进行中)
'Perform housekeeping on delinquency date
Columns("AH:AH").Select
Selection.NumberFormat = "0"
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
True, Transpose:=False
Dim delinquency()
ReDim del(1 To importwsRowCount, 1 To 1)
del = Range("AH1:AH" & importwsRowCount).Value
For i = LBound(del, 1) To UBound(del, 1)
delChars = Len(del(i, 1)) 'Determine length of entry
If IsNumeric(del(i, 1)) = True Then 'Determine datatype of entry
delType = "Numeric"
Else
delType = "String"
End If
If InStr(del(i, 1), ".") Then 'Removes monetary entries like 142.84
del(i, 1) = Empty
ElseIf InStr(del(i, 1), "*") Then 'Removes ***INVALID*** entries
del(i, 1) = Empty
ElseIf delChars = 12 Then 'Removes all entries that extend beyond the 12 character limit of the field and get cut off
del(i, 1) = Empty
ElseIf delType = "String" And Len(del(i, 1).Value) < 10 And InStrRev(del(i, 1).Value, " ") Then 'Takes the number from entries like 2194 Days or 23 DPD
del(i, 1).Value = Left(del(i, 1).Value, Len(del(i, 1).Value) - InStrRev(del(i, 1).Value, " "))
If IsNumeric(del(i, 1)) = False Then 'If the characters to the left of the space are not numbers, discard
del(i, 1).Value = Empty
Else
del(i, 1).Value = Format((CLng(Range("E" & i + 1).Value) - Abs(del(i, 1).Value)), "mm/dd/yy") 'Pull order date and subtract days from it for delinquency date
End If
ElseIf delType = "Numeric" And Len(del(i, 1)) = 5 Then
If del(i, 1).Value > CLng(Date) Then 'Value is greater than todays date, improperly formated date that needs character manipulation and / added
del(i, 1).Value = Format(del(i, 1).Value, "000000") 'Add leading zero
del(i, 1).Value = DateSerial(Right(del(i, 1).Value, 2), Left(del(i, 1).Value, 2), Right(Left(del(i, 1).Value, 2), 4)) 'Grab year, then month, then day for serialize
Else
del(i, 1).Value = Format(del(i, 1).Value, "mm/dd/yy") 'Properly formated date that just needs format conversion
End If
ElseIf delType = "Numeric" And (delChars = 7 Or delChars = 8) Then
If delChars = 7 Then
del(i, 1).Value = Format(del(i, 1).Value, "00000000") 'Add leading zero
End If
del(i, 1).Value = DateSerial(Right(del(i, 1).Value, 4), Left(del(i, 1).Value, 2), Right(Left(del(i, 1).Value, 2), 6)) 'Grab year, then month, then day for serialize
ElseIf delType = "Numeric" And delChars < 5 Then
del(i, 1).Value = Format((CLng(Range("E" & i + 1).Value) - Abs(del(i, 1).Value)), "mm/dd/yy")
End If
Next i
Set dRange = Range("AJ1:AJ" & importwsRowCount)
iWS.names.Add Name:="dRange", RefersTo:=delRange
delinquency = Application.Transpose(delinquency) 'Transpose rows and columns
Range("dRange").Value = delinquency 'Write array to worksheet