0

問題

特定のフィールドに多数の不適切または不均一な日付が入力された大規模なデータセット。約 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

エントリーテンプレート

9月 25, 20 (いいえ、いいえ、削除してください。)
SEPT (いいえ、役に立たない、削除してください。)
N/A (くだらない! 削除してください。)
LONG TIME AG (ばかがこれを良い考えだと思った、削除してください。)
JUNE 30 , 200 (どうやらこのフィールドは 12 文字しか保持しないようです。削除します。)
CHARGED OFF (役に立たない、削除します。)
94 DAYS (スペースの前にあるすべての文字を取り、注文日を含む他のフィールドから差し引いて、延滞日を取得します。)
94 DPD (DPD in 2008-7-15
12 (追加番号がわからないので、スペースの前のすべての文字を取り、変換してください。)
無効(削除)
BLANK (何もしない。)
12282009 (ネストされた LEFT と RIGHT を使用し、その間に / を挟んで CONCATENATE する。)
9202011 (先行ゼロを追加し、上記と同じ。)
92410 (先行ゼロを追加。これは 09/24/10 に変換される)
41261 (1899 年 12 月 31 日からの日数、これは 12/08/12 に変換されます)
1023 (滞納からの日数、滞納日を取得するために ORDER DATE から減算します。)
452 (上記と同じ。)
12 (上記と同じ。)
1432.84 (金銭的価値、IQの低い下僕が間違って入力。削除。)

コード (進行中の作業)

'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
4

1 に答える 1

0

「54日」は7文字なので7文字Len("54 Days")です

スペース文字は位置 3 にあり、3 をInStrRev("54 Days", " ")返します。

したがって、明らかに数値でないLeft("54 Days", 7 - 3)ものを生成するものがあります"54 D"

おそらくLeft(del(i, 1), InStrRev(del(i, 1), " ") - 1)代わりに試してください

于 2012-11-06T22:50:04.253 に答える