2017-02-09 17 views
9

Korzystam z poniższego kodu, aby przyciąć niektóre "puste komórki", które zawierają spację. Chodzi o to, że zajmuje to zbyt dużo czasu, podobnie jak pętla do każdej komórki. Chcę usunąć spacje (te na początku i końcu, a nie na środku) ze wszystkich komórek.TRIM funkcja/usuwanie spacji z komórek przy użyciu VBA

Czy istnieje łatwiejszy sposób, w jaki mogę zastosować wszystkie naraz?

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

Czy ustawiasz 'Application.ScreenUpdating = False' przed uruchomieniem tego? To może drastycznie przyspieszyć kod VBA. Po prostu nie zapomnij ustawić 'Application.ScreenUpdating = True' na końcu twojego kodu. – TylerH

+2

@ TylerH głównym wąskim gardłem tutaj jest czytanie i pisanie pojedynczych komórek, ale jeśli masz zamiar zacząć zmieniać 'ScreenUpdating', powinieneś przynajmniej przywrócić go do tego, co to * było * zanim twoja procedura porwała go. – ThunderFrame

+1

@ThunderFrame Tak, dlatego dlaczego powiedziałem ustawić powrót do wartości true na końcu twojego kodu. – TylerH

Odpowiedz

10

Dostaniesz znacznie lepszą wydajność kopiowanie danych do tablicy, i pracy na tablicy, a następnie umieszczając dane z powrotem do zakresu.

Ponadto nie należy używać Excel.Application.Trim. To jest składnia Excel 95 i późno-wywołanie z nieoczekiwaną obsługą błędów. VBA ma wbudowaną funkcję Trim - jest około 10 razy szybsza i zapewnia IntelliSense.

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

Bardzo dziękuję, droga, droga szybciej! –

+0

ale nie mam formuł, czy mogę po prostu usuń v? –

+0

Nie powinno to mieć znaczenia, ale jeśli chcesz być bardziej jednoznaczna, po prostu zmień oba zastosowania '.Formula' na' .Value' – ThunderFrame

7

Czy to na całego zakresu naraz przy użyciu wersji tablicy Excel Trim:

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

Korzystanie jedyne zmienne widoczne w kodzie, byłoby:

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

To jest szybsze niż moja odpowiedź, a jeśli zakres zawiera formuły, to coul d zamień instancje '.Value' na' .Formula' i zachowaj formuły. – ThunderFrame

Powiązane problemy