Excel,VBA - 角色操作&内部数组格式化

时间:2012-11-06 17:06:12

标签: excel parsing date excel-vba formatting vba

ISSUE

在特定字段中具有许多不正确或非均匀输入日期的大型数据集。在约60,000条记录中,约有19种不同的方式输入日期。某些条目完全无效,必须丢弃,其他条目必须正确格式化。我正在将范围加载到数组中,然后执行操作。 我写了我认为需要的操作,但是我需要一些帮助才能让它们正常工作。见下面的代码;评论中的错误。

当前问题

对于像'54 Days'这样的条目,下面的代码应该只取空格左边的字符,然后检查它们是否是数字。如果它们是,它保留它们,如果它们不是它清空那个数组元素。 在实践中,没有任何事情发生,我仍然在数组元素中有完整的条目?

ElseIf delType = "String" And Len(del(i, 1)) < 10 And InStrRev(del(i, 1), " ") Then 'Takes the number from entries like 2194 Days or 23 DPD
    del(i, 1) = Left(del(i, 1), Len(del(i, 1)) - InStrRev(del(i, 1), " "))
    If IsNumeric(del(i, 1)) = False Then 'If the characters to the left of the space are not numbers, discard
        del(i, 1) = Empty
    Else
        del(i, 1) = Format((CLng(Range("E" & i + 1).Value) - Abs(del(i, 1))), "mm/dd/yy") 'Pull order date and subtract days from it for delinquency date
    End If

进入模板

九月25,20 (没有年份,没有年份!删除。)
SEPT (没有年份,没用,删除。)
N / A (垃圾!已删除。)
LONG TIME AG (什么白痴认为这是一个好主意,删除。)
6月30日,200 (显然该字段只能容纳12个字符,删除。)
收费(无用,删除。)
94 DAYS (获取空格前的所有字符,并从包含订单日期的其他字段中减去,以获取拖欠日期。)
94 DPD (DPD在某些人心目中代表着我过去的天过去。与上述相同。)
2008-7-15 12 (不确定是什么附加号码,在空格和转换前拍摄所有字符。)
无效(删除。)
BLANK (什么都不做。)
12282009 (使用嵌套的LEFT和RIGHT,并在/之间使用CONCATENATE。)
9202011 (添加前导零,然后与上述相同。)
92410 (添加前导零,这将转换为09/24/10)
41261 (自1899年12月31日起,这将转变为2012年8月12日) 1023 (拖欠日后的天数,从订单日期减去以获取逾期日期。)

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 del()
ReDim del(1 To importwsRowCount, 1 To 1)
del = Range("AH1:AH" & importwsRowCount).Value
Dim delChars As Long
Dim delType As String
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)) < 10 And InStrRev(del(i, 1), " ") Then 'Takes the number from entries like 2194 Days or 23 DPD
        del(i, 1) = Left(del(i, 1), Len(del(i, 1)) - InStrRev(del(i, 1), " "))
        If IsNumeric(del(i, 1)) = False Then 'If the characters to the left of the space are not numbers, discard
            del(i, 1) = Empty
        Else
            del(i, 1) = Format((CLng(Range("E" & i + 1).Value) - Abs(del(i, 1))), "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) > CLng(Date) Then 'Value is greater than todays date, improperly formated date that needs character manipulation and / added
            del(i, 1) = Format(del(i, 1), "000000") 'Add leading zero
            del(i, 1) = DateSerial(Right(del(i, 1), 2), Left(del(i, 1), 2), Right(Left(del(i, 1), 2), 4)) 'Grab year, then month, then day for serialize
        Else
            del(i, 1) = Format(del(i, 1), "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) = Format(del(i, 1), "00000000") 'Add leading zero
        End If
        del(i, 1) = DateSerial(Right(del(i, 1), 4), Left(del(i, 1), 2), Right(Left(del(i, 1), 2), 6)) 'Grab year, then month, then day for serialize
    ElseIf delType = "Numeric" And delChars < 5 Then
        del(i, 1) = Format((CLng(Range("E" & i + 1)) - Abs(del(i, 1))), "mm/dd/yy")
    End If
Next i
Set delRange = Range("AJ1:AJ" & importwsRowCount)
iWS.names.Add Name:="dRange", RefersTo:=delRange
Range("dRange").Value = del 'Write array to worksheet

1 个答案:

答案 0 :(得分:0)

“54天”包含7个字符,因此Len("54 Days")为7

空格字符出现在位置3,InStrRev("54 Days", " ")返回3

所以,我们Left("54 Days", 7 - 3)生成"54 D",显然不是数字

或许尝试使用Left(del(i, 1), InStrRev(del(i, 1), " ") - 1)