2017-02-09 2 views
9

Ich verwende den folgenden Code, um einige "leere Zellen" zu trimmen, die ein Leerzeichen enthalten. Die Sache ist es dauert zu viel Zeit, als Schleife zu jeder Zelle. Ich möchte die Leerzeichen (die am Anfang und am Ende, nicht in der Mitte) aller Zellen entfernen.TRIM-Funktion/Entfernen von Leerzeichen aus Zellen mit VBA

Gibt es einen einfacheren Weg, den ich auf einmal anwenden kann?

For a = 1 To ScenarioTableLastRow 
    For f = 1 To ScenarioTableLastColumn 

     If Cells(a, f) <> "" Then 
      Cells(a, f) = Excel.Application.Trim(Cells(a, f)) 
     End If 

    Next f 
Next a 
+0

Sind Setzen Sie 'Application.ScreenUpdating = False', bevor Sie das ausführen? Das kann den VBA-Code drastisch beschleunigen. Vergiss nicht, 'Application.ScreenUpdating = True' am Ende deines Codes zu setzen. – TylerH

+2

@TylerH der größte Flaschenhals hier ist das Lesen und Schreiben einzelner Zellen, aber wenn Sie 'ScreenUpdating' beginnen, sollten Sie es zumindest wiederherstellen, was auch immer es * war, bevor Ihre Prozedur es entführt hat. – ThunderFrame

+1

@ ThunderFrame Ja, also warum ich sagte, setze es am Ende deines Codes auf true zurück. – TylerH

Antwort

10

Sie werden die Daten in ein Array viel bessere Leistung Kopieren erhalten und die Arbeit auf dem Array, dann die Daten zurück in den Bereich platzieren.

Verwenden Sie auch nicht Excel.Application.Trim. Das ist die Excel 95-Syntax und ein spät gebundener Aufruf mit unerwarteter Fehlerbehandlung. VBA hat eine integrierte Trim Funktion - es ist etwa 10 mal schneller und es bietet Intellisense. auf einmal

Sub test() 

    'Assuming ScenarioTable is a range 
    Dim ScenarioTable As Range 
    Set ScenarioTable = Range("ScenarioTable") 

    'I assume your range might have some formulas, so... 
    'Get the formulas into an array 
    Dim v As Variant 
    v = ScenarioTable.Formula 

    Dim a As Long 
    Dim f As Long 
    'Then loop over the array 
    For a = LBound(v, 1) To UBound(v, 1) 
     For f = LBound(v, 2) To UBound(v, 2) 
      If Not IsEmpty(v(a, f)) Then 
       v(a, f) = VBA.Trim(v(a, f)) 
      End If 
     Next f 
    Next a 
    'Insert the results 
    ScenarioTable.Formula = v 
End Sub 
+0

Vielen Dank! viel schneller! –

+0

aber ich habe keine Formeln, kann ich einfach entfernen Sie die v? –

+0

Es sollte nicht wichtig sein, aber wenn Sie expliziter sein wollen, ändern Sie einfach beide Verwendungen von '.Formula' zu' .Value' – ThunderFrame

7

es auf den gesamten Bereich Sie die Array-Version von Excel Trim mit:

myRange.Value = Application.Trim(myRange.Value) 

Mit Hilfe der einzigen Variablen sichtbar in Ihrem Code, wäre es:

With Range(Cells(1,1), Cells(ScenarioTableLastRow, ScenarioTableLastColumn)) 
    .Value = Application.Trim(.Value) 
End With 
+3

Dies ist schneller als meine Antwort, und wenn der Bereich Formeln enthält, können Sie coul d Ersetzen Sie die Instanzen von '.Value' für' .Formula' und bewahren Sie die Formeln auf. – ThunderFrame

Verwandte Themen