Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1876to1880
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
Inhaltsverzeichnis

Schleife zu langsam

Schleife zu langsam
01.04.2022 16:51:58
Stefan
Hallo zusammen,
ich hab mir mit meinem kleinen VBA Wissen ein Makro zusammenkopiert/-gezimmert. Da läßt mich aber jetzt unten stehende Schleife im Stich. Die Tabellen die dabei formatiert werden sollen, sind riesig. Bis zu 60000 Zeilen und bis zu 200 Spalten. Für das berechnen braucht das Makro teilweise 30 min. Gibt es dafür einen schnelleren Weg?
Sub Tabelle_formatieren()
Dim lRow As Long, i As Long, m As Integer, lColumn As Integer, s As Integer
Dim entry As Boolean
Dim dict As Object
Dim zelle As Range
Dim Werte() As String
Dim j As Integer
Const TRKz As String = ", "
Dim rngZelle As Range
Range("C:D").EntireColumn.Insert
Range("C:D").ColumnWidth = 30
Cells(5, 3).Value = "Namen"
Cells(5, 4).Value = "Schlüssel"
With ActiveSheet
lRow = .Cells(.Rows.count, "A").End(xlUp).Row
lColumn = Cells(1, Columns.count).End(xlToLeft).Column
End With
For i = 6 To lRow
Cells(i, 3).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R1C9:R1C" & lColumn & ",""""))"
Cells(i, 3).Value = Cells(i, 3).Value
Cells(i, 4).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R5C10:R5C" & lColumn & ",""""))"
Cells(i, 4).Value = Cells(i, 4).Value

Next i
...
Schöne Grüße
Stefan

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife zu langsam
01.04.2022 17:03:15
Dietmar
Hallo Stefan,
vielleicht probierst du das mal aus:
direkt nach dem letzten "Dim" setzt du diese Zeile
Application.Calculation = xlManual
Und dann ganz am Ende diese
Application.Calculation = xlAutomatic
Viele Grüße
Dietmar
AW: Schleife zu langsam
01.04.2022 17:23:22
Stefan
Hallo Dietmar,
vielen Dank! Funktioniert. Statt ca. 15 min nur noch ca 3 min. Damit kann ich leben. Es kann manchmal so einfach sein ;)
Gruß
Stefan
AW: Schleife zu langsam
01.04.2022 17:24:45
onur
Das sollte normalerweise Sekunden dauern. Poste mal die Datei.
AW: Schleife zu langsam
01.04.2022 17:42:26
Daniel
Wenn diese Einstellung die Durchlaufzeit signifikant verbessert, ist der Code noch nicht optimal geschrieben.
Erst wenn diese Maßnahme wenig bis nichts bringt, ist der Code gut.
Gruß Daniel
Anzeige
AW: Schleife zu langsam
01.04.2022 17:13:15
onur
Wozu ein Mix aus Excel-Formeln und VBA ?
Erkläre doch einfach, was in den Zellen nachher stehen muss.
Anzeige
AW: Schleife zu langsam
01.04.2022 17:21:21
Stefan
Hallo Onur,
ich weiß leider nicht wie man soetwas umsetzt. Da hat der Makrorekorder herhalten müssen. Es muss die Zeile nach "X" durchsucht werden und dann die entsprechenden "Überschriften" der jeweiligen Spalten verknüpft in eine Zelle geschrieben werden. Und das für alle Zeilen
Gruß
Stefan
AW: Schleife zu langsam
01.04.2022 17:22:57
onur
Dann poste doch mal eine (Beispiels-) Datei, wo man genau sehen kann, was du meinst.
AW: Schleife zu langsam
01.04.2022 19:44:53
onur
Hier meine Lösung, die bei über 60.000 Zeilen 4,3 sec braucht:
https://www.herber.de/bbs/user/152180.xlsm
Ich habe es mit über 60.000 Zeilen getestet, musste aber fast alle wieder löschen, da sonst Datei zu gross.
Anzeige
AW: Schleife zu langsam
01.04.2022 23:19:57
Stefan
Hallo Onur,
ich bin schwer beeindruckt! Vielen Dank. Funktioniert wunderbar.
Schöne Grüße
Stefan
Gerne !
01.04.2022 23:21:07
onur
AW: Schleife zu langsam
01.04.2022 17:39:51
Daniel
Hi
jede Zelle einzeln bearbeiten ist langsam.
man schreibt die Formeln in alle Zellen gleichzeitig, dann kopiert man den ganzen Block und fügt ihn als Wert ein.
also aus

For i = 6 To lRow
Cells(i, 3).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R1C9:R1C" & lColumn & ",""""))"
Cells(i, 3).Value = Cells(i, 3).Value
Cells(i, 4).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R5C10:R5C" & lColumn & ",""""))"
Cells(i, 4).Value = Cells(i, 4).Value
Next i
macht man besser:

With Range("C6:D" & lRow)
.Columns(1).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R1C9:R1C" & lColumn & ",""""))"
.Columns(2).Formula2R1C1 = "=TEXTJOIN("", "",TRUE,IF(R[0]C[6]:R[0]C" & lColumn & "=""x"",R5C10:R5C" & lColumn & ",""""))"
.Formula = .Value
End With
bei großen Zellbereichen kann es auch sein, dass

.Copy
.PasteSpecial xlpastevalues
schneller ist als

.Formula = .Value
allerding macht .Formula = .Value aus dem Formelergebnis "" eine echte Leerzelle, während bei .PasteSpecial diese Zellen den Text "" enthalten und nicht leer sind.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige