Ich habe die gleiche Frage auf StackOverflow thread geschrieben, aber ich denke, hier ist der richtige Ort zu fragen (wenn nicht richtig ist, bitte entfernen Admin). Jeden Tag muss ich das von AS400 importierte Datum formatieren (Daten, Zeit, ..). Normalerweise (für einige tausend Datensätze) benutze ich diesen Code.Fügen Sie ein Array (einzelne Dimension) mit> 100K Artikel in einen Excel-Bereich
Public Sub Cfn_FormatDate(control As IRibbonControl)
Application.ScreenUpdating = False
Dim UR As Long, X As Long
Dim MyCol As Integer
MyCol = ActiveCell.Column
UR = Cells(Rows.Count, MyCol).End(xlUp).Row
For X = 2 To UR
If Not IsDate(Cells(X, MyCol)) Then
Select Case Len(Cells(X, MyCol))
Case 8
Cells(X, MyCol) = DateSerial(Left(Cells(X, MyCol), 4), Mid(Cells(X, MyCol), 5, 2), Right(Cells(X, MyCol), 2))
Case 6
Cells(X, MyCol) = DateSerial(Left(Cells(X, MyCol), 2), Mid(Cells(X, MyCol), 3, 2), Right(Cells(X, MyCol), 2))
End Select
End If
Next X
Columns(MyCol).NumberFormat = "DD/MM/YYYY;@"
Columns(MyCol).EntireColumn.AutoFit
Application.ScreenUpdating = True
End Sub
Wenn die Datensätze jedoch viel mehr sind, wird der Code Code nicht ausgeführt. (ex 70K Aufzeichnungen wurden in 18 Sekunden formatiert/Einfügen) so dachte ich Variablen in einem Array zu verwenden, und ich schrieb diesen Code:
Sub ConvDate(c As Integer)
Application.ScreenUpdating = False
Dim lrw As Long, i As Long
Dim ArrVal As Variant
lrw = ActiveSheet().Range(Cells(1, c)).End(xlDown).Row
ReDim ArrVal(2 To lrw)
For i = 2 To lrw
If IsDate(Cells(i, c)) Then
ArrVal(i) = Cells(i, c)
Else
Select Case Len(Cells(i, c)) ' to check YYYYMMDD or YYMMDD
Case 8
ArrVal(i) = DateSerial(Left(Cells(i, c), 4), Mid(Cells(i, c), 5, 2), Right(Cells(i, c), 2))
Case 6
ArrVal(i) = DateSerial(Left(Cells(i, c), 2), Mid(Cells(i, c), 3, 2), Right(Cells(i, c), 2))
End Select
End If
NextX:
Next i
Range(Cells(2, c), Cells(lrw, c)) = ArrVal
Columns(c).NumberFormat = "DD/MM/YYYY;@"
Columns(c).EntireColumn.AutoFit
Application.ScreenUpdating = True
End Sub
es nicht funktionieren, alle Zellen (im Bereich) haben die gleiches Ergebnis (Zellen (2, c)). ein Mann und schlug mir den Code zu ändern, wie:
ActiveSheet.Range(Cells(2, c), Cells(lrw, c)).Value = WorksheetFunction.Transpose(ArrVal)
diese Änderung ist die Begrenzung, über 65.536 Datensätze erhalte ich einen Fehler (Laufzeit 13, Typ Mismatch)
Ihr Fehler ist wahrscheinlich, weil 'c' ist ein 'Integer', die eine Größenbegrenzung von 65.535 hat. Machen Sie stattdessen ein 'Long'. – Kaz
Zak?!?!?!? "c" ist die Spaltennummer, und es ist fix. – Fabrizio
Mein schlechtes. ein Fehler auf 65536 ist \ * fast \ * immer, weil du irgendwo einen 'Int' deklariert hast, der übergelaufen ist. Ich überflog den Code, sah ein Int und nahm an, dass es wahrscheinlich so war. – Kaz