Discussion:
Trim auf ganzes Excel-Sheet?
(zu alt für eine Antwort)
Thomas Graf
2006-01-14 14:53:20 UTC
Permalink
Hallo,

Gibt es eine effiziente Art auf alle Einträge in einem Excel-Sheet
Trim() anzuwenden? 2 Verschachtelte Schleifen sind jedenfalls bei
mehreren Tausend Zeilen und Hundert Spalten nicht sinnvoll verwendbar
(sehr sehr langsam).

ciao - Thomas
Thomas Ramel
2006-01-14 15:08:15 UTC
Permalink
Grüezi Thomas

Thomas Graf schrieb am 14.01.2006
Post by Thomas Graf
Gibt es eine effiziente Art auf alle Einträge in einem Excel-Sheet
Trim() anzuwenden? 2 Verschachtelte Schleifen sind jedenfalls bei
mehreren Tausend Zeilen und Hundert Spalten nicht sinnvoll verwendbar
(sehr sehr langsam).
IMO ist das so direkt nicht möglich

Du könntest aber ein temporäres Tabellenblatt einfügen und auf diesem per
GLÄTTEN() die Werte des ersten Tabellenblattes aufbereiten und diese dann
wieder zurückkopieren und das temporäre Tabellenblatt löschen.

Wenn Du dies mit VBA erstellst, dürfte dies schneller sein, als alle Zellen
abzuklappern.



Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Microsoft Excel - Die ExpertenTipps:
(http://tinyurl.com/9ov3l und http://tinyurl.com/cmned)
Eike Bimczok
2006-01-14 19:44:51 UTC
Permalink
Hallo Thomas,

eine interessante Frage. Ich habe mich mal an einem einigermassen
performanten Ansatz versucht ;-)
Zum Testen habe ich ein Sheet mit ca 4500 Zeilen und ca 200 Spalten mit
Werten befüllt (insgesamt 925165 Zellen).
Die erste Sub hab ich zum Vergleich geschrieben, sie entspricht in etwa
deinem Ansatz und braucht ca 48 Sekunden.
Die zweite Lösung ist sehr viel schneller, hier läuft es in einem
Viertel der Zeit, also ca 12 Sekunden.

Ich bin gespannt, ob es noch schnellere Lösungen gibt.

Gruß
Eike


'=================================================
Sub trimAllLangsam()
'1-2006
'E.Bimczok

Dim a As Range, myTime
myTime = Now()

Application.ScreenUpdating = False
For Each a In ActiveSheet.UsedRange
a.Value = Trim(a.Value)
Next a
Application.ScreenUpdating = True
MsgBox (Second(myTime - Now))

End Sub
'=================================================
Sub trimAll()
'1-2006
'E.Bimczok
Dim a As Range, myTime, b()
myTime = Now()

Set a = ActiveSheet.UsedRange
b = a

Dim jboundL As Long, jboundU As Long
jboundL = LBound(b, 2)
jboundU = UBound(b, 2)

For k = LBound(b, 1) To UBound(b, 1)
For j = jboundL To jboundU
b(k, j) = Trim(b(k, j))
Next j
Next k
Application.ScreenUpdating = False
a = b
Application.ScreenUpdating = True

MsgBox (Second(myTime - Now))

End Sub
'=================================================
Post by Thomas Graf
Hallo,
Gibt es eine effiziente Art auf alle Einträge in einem Excel-Sheet
Trim() anzuwenden? 2 Verschachtelte Schleifen sind jedenfalls bei
mehreren Tausend Zeilen und Hundert Spalten nicht sinnvoll verwendbar
(sehr sehr langsam).
ciao - Thomas
Loading...