2016-02-02 3 views
5

Das folgende Skript funktioniert bei kleineren Datensätzen (weniger als 30k Zeilen oder so), führt jedoch zu "#VALUE" -Fehlern für jede Zelle im ausgewählten Bereich, wenn der Bereich größer ist.VBA und Excel: Warum führt mein TRIM-Skript bei großen Datensätzen zu #VALUE?

Dim FirstCell As Range, LastCell As Range, MyRange As Range 

Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Column) 

Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Column) 

Set MyRange = Range(FirstCell, LastCell) 
     MyRange.Select 
     If MyRange Is Nothing Then Exit Sub 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 
    With Selection 
     .Value = Evaluate("if(row(" & .Address & "),clean(trim(" & .Address & ")))") 
    End With 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

VBA TRIM Error

+0

Über wie viele Zellen ändern Sie mit diesem Code? Ich habe es gerade auf ~ 1,7 Millionen Zellen getestet und ich habe keine Fehler – TMH8885

+0

8,106,860 Zellen auf meinem Praxisdokument erhalten. Das sind 161.363 Zeilen. –

+0

Es scheint bis zu 70k Zeilen zu arbeiten. Zu viel mehr als das, es setzt nur den Wert jeder Zelle im ausgewählten Bereich auf #WERT. –

Antwort

1

ich Ihr Problem zu replizieren verwaltet und mit einer Variante Array, wie unten gezeigt überwindet das Problem für großen Datensätze

Dim FirstCell As Range, LastCell As Range, MyRange As Range 
Dim DataRange() As Variant 
Dim lRows As Long 
Dim lCols As Long 
Dim i As Long, j As Long 
Dim value As String 

Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Column) 

Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Column) 

Set MyRange = Range(FirstCell, LastCell) 
    MyRange.Select 
    If MyRange Is Nothing Then Exit Sub 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    lRows = MyRange.Rows.Count 
    lCols = MyRange.Columns.Count 
    ReDim DataRange(1 To lRows, 1 To lCols) 
    DataRange = MyRange.value 
    For j = 1 To lCols 
    For i = 1 To lRows 
     DataRange(i, j) = Trim(DataRange(i, j)) 
    Next i 
    Next j 

    MyRange.value = DataRange 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

Als Referenz verwenden ich diesen Artikel zu helfen kommen Sie mit der Antwort: https://blogs.office.com/2008/10/03/what-is-the-fastest-way-to-scan-a-large-range-in-excel/

+0

Links können in Zukunft gebrochen werden. Kopieren Sie die Informationen, die zur Beantwortung der Frage benötigt werden, in Ihren Post. Geben Sie den Link nur als Referenz ein. – eirikdaude

+0

Ich habe die Antwort aktualisiert, um es klarer zu machen, dass der Link nur als Referenz diente, die Antwort ist oben enthalten – TrtlBoy

Verwandte Themen