Anzeige
Archiv - Navigation
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
788to792
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zellen teilen

Zellen teilen
08.08.2006 13:17:36
EDE
Hallo zusammen!
Ich habe mir ein Makro gebastelt, das die Zeichenfolgen "kg" und "bis" im Sheet "RohDatenErstellt" sucht.
Bei einem Treffer soll die gefundene Zelle wie folgt geteilt werden (Einfügrichtung ist rechts).
1. steht die gefundene Zeichenfolge (z.B. "kg") in der Zelle ganz links, dann bleibt "kg" in der Zelle, eine Zelle wird eingefügt und bekommt den Rest des Tetxtes
2. steht "kg" im Text bleibt in der gefundenen Zelle der Textteil links von "kg", eine Zelle mit "kg" wird eingefügt und eine weitere mit dem Textteil rechts von "kg"
3. steht "kg" ganz rechts im Text bleibt in der gefundenen Zelle der Text links von "kg" und eine Zelle mit "kg" wird eingefügt
So, das funktioniert auch einwandfrei.
Schaut Euch mal das Makro in
https://www.herber.de/bbs/user/35646.xls
an.
Mein Problem ist nur, daß diese Schleife viel zu langsam ist um größere Tabellen zu bearbeiten (30 Spalten mit 2500 Zeilen).
Wie muß ein deutlich schnelleres Makro aussehen?
Vielen Dank EDE

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellen teilen
08.08.2006 13:42:00
Klaus
Hallo Ede,
versuch zunächst mal,
Application.Screenupdating = false
an den Anfang des Codes zu setzen. Nicht vergessen, als letzte Codezeile wieder
Application.Screenupdating = true
zu setzen!
Das sollte schonmal ein paar Sekunden bringen.
Da es bestimmt noch mehr Verbesserungspotential gibt, lass ich mal offen ...
Gruß,
Klaus Meyer-von der Twer
AW: Zellen teilen
08.08.2006 14:03:24
EDE
Hallo Klaus,
danke für den Hinweis, habe ich schon eingebaut. Hilft aber bei der größe der Tabellen leider nicht wirklich.
Danke EDE
AW: Zellen teilen
10.08.2006 09:08:04
ingUR
Hallo, @EDE,
Soweit ich es erkennen kann, sind eigentlich nur kaumm nennenswerte Änderungen zur Ausführungszeitoptimierung möglich. Jedoch zuvoe die Frage: werden im Tabellenbatt, das verändert wird, Zellenformeln enthalten?
Wenn Zellenformeln enthalten sind und dann kein Ergebnis Auswirkungen auf die Prozedurauswirkung hat, dann solltest folgenden "Rahmen", der den Hinweis von Klaus einbindet, um den Ausführungsteil legen:

Dim OldSetScreenUpdating As Boolean, OldSetCalculation
OldSetScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
OldSetCalculation = Application.Calculation
Application.Calculation = xlCalculationManual
... [hier steht das gesamte Programm, das weder ein Bildschirmm-Update
...  noch eine Berechnungsaktualisierung der Zellenformel benötigt]
Application.Calculation = xlCalculationAutomatic
Application.Calculation = OldSetCalculation
Application.ScreenUpdating = True
Application.ScreenUpdating = OldSetScreenUpdating
End Sub

Du hast hier eine Beispieldatei mit 33 Zeilen und drei Spalten vorgestellt. Deine Routinen, die Du zur Ermittlung der Maximalen Zeilen- und Spaltennummer verwendest, kann durch folgenden Ansatz auf ca. ein viertel im Zeitbedarf gesenkt werden, was bei ca. 33000 Zeilen etwa 15 sec. ausmacht (getestet an 10000 Durchläufen), wenn maximal drei Spalten in der Ausgangstabelle enthalten sind - kein wirklicher Zeitgewinn, jedoch bei größerer Spaltenanzahl könnte dieser Zeitgewinn sich vergrößern.

Set ws = Sheets("RohDatenErstellt")
ws.Select
'________________________________________________________________________
'  nicht leere Zeilen und Spalten zählen
'  vormals: GoSub NichtLeereZählen
'________________________________________________________________________
With ws
intRowEnd = .Cells(Cells.Rows.Count, 1).End(xlUp).Row
Dim r As Long, c As Integer
For r = 1 To intRowEnd
c = .Cells(r, Cells.Columns.Count).End(xlToLeft).Column
If c > intColumnEnd Then intColumnEnd = c
Next r
End With

Eine weitere Optimierung könnte dadurch erreicht werden, dass man vor den IF-Abfragen zur Festellung der Muterposition im String die Abfrage setzt, ob die Länge des Zellenstring überhaubt größer als Null ist, denn dann gann man die Abfragen in dem Zusammenhang mit der Position übergehen. Dies wirkt sich aus, wenn die Datenreihe an ihrem Ende starkt flattern.
Zudem kann ein kleiner Zeitgewinn dadurch entehen, dass man die einzelnen Positions-IF-Fragen durch ELLSE verbindet, denn wenn eine IF-Anweisung zutrifft, brauchen die anderen nicht mehr berücksichtigt zu werden.

Zellenstring = Cells(intRow, intColumn).Value
iLenZS = Len(Zellenstring)
If iLenZS > 0 Then
Pos = InStr(Zellenstring, strPos)
If Pos = 1 And Zellenstring <> strPos Then
Cells(intRow, intColumn).Insert Shift:=xlToRight
intColumn = intColumn + 1
Cells(intRow, intColumn - 1) = Mid(Zellenstring, Pos, iLenP)
Cells(intRow, intColumn) = Right(Zellenstring, iLenZS - Pos - iLenP + 1)
intColumn = intColumn - 1
Else
If Pos > 1 And Pos < iLenZS - iLenP + 1 Then
Cells(intRow, intColumn).Insert Shift:=xlToRight
Cells(intRow, intColumn).Insert Shift:=xlToRight
intColumn = intColumn + 2
Cells(intRow, intColumn - 2) = Left(Zellenstring, Pos - 1)
Cells(intRow, intColumn - 1) = Mid(Zellenstring, Pos, iLenP)
Cells(intRow, intColumn) = Right(Zellenstring, iLenZS - Pos - iLenP + 1)
intColumn = intColumn - 2
Else
If Pos > 1 And Pos = iLenZS - iLenP + 1 Then
Cells(intRow, intColumn).Insert Shift:=xlToRight
intColumn = intColumn + 1
Cells(intRow, intColumn - 1) = Left(Zellenstring, Pos - 1)
Cells(intRow, intColumn) = Mid(Zellenstring, Pos, iLenP)
intColumn = intColumn - 1
End If
End If
End If
End If
Next intColumn
Allerdings sind dies wohl nur Änderungen, die für Dein Beispieldatenblatt keine merkbaren Zeitgewinn bei der Ausführung bringen.
Gruß,
Uwe
Anzeige
AW: Zellen teilen
12.08.2006 12:41:59
Erich
Hallo Ede,
um einiges schneller gehts, wenn man das Einfügen von Zellen vermeidet, die Zerlegung
in einem Array durchführt und das Array dann in die Tabelle schreibt.
https://www.herber.de/bbs/user/35743.xls
Schau dir mal die beiden neuen Makros in der Mappe an.
Sie zerlegen unterschiedlich, wenn der Suchbegriff mehrfach innerhalb einer Zelle auftaucht.
In B1 habe ich am Ende schreiben lassen, welche Zeit das Makro braucht.
Damit man Zeitunterschiede gut sieht, lasse ich die Makros über ca. 930 Zeilen laufen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Zellen teilen
14.08.2006 09:45:13
Ede
Hallo Erich,
fuktioniert alles bestens, Laufzeit jetzt akzeptabel.
Super.
Ede

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige