Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1916to1920
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

Makro sehr langsam

Makro sehr langsam
01.02.2023 11:22:15
Bianca
Hallo,
ich habe hier ein Makro. Hintergrund ist eine Abfrage von Vergleichswerten und eine Rückgabe von Daten bei gleichem Wert. Das ganze geht über eine Loop Abfrage in zwei Excel Sheets die Zeilen durch. Ich weiß es ist wahrscheinlich nicht besonders "schön" programmiert, aber es funktioniert so weit. Nur ist es sehr langsam. Es werden zwischen 1000 und 2000 Zeilen abgefragt. Die Frage ist nun, ob es irgendwie zu beschleunigen ist?
Anbei die beiden Codes:
Sub Berechnen()
    Application.ScreenUpdating = False
    Sheets("Eingabe").Select
    Range("B8").Select
    Selection.End(xlDown).Select
        If ActiveCell = "" Or Range("B5") = "" Or Range("B3") = "" Then
        On Error GoTo Fehler
Fehler:
        MsgBox "Eingabewert fehlt!", vbExclamation
    Else
    ActiveCell.Offset(ColumnOffset:=2).Activate
    ActiveCell.FormulaR1C1 = "=RC[-2]/R5C2"
    ActiveCell.Select
    Selection.Copy
    Selection.End(xlUp).Select
    ActiveCell.Offset(RowOffset:=1).Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    ActiveCell.Select
    Application.CutCopyMode = False
    End If
    'Application.Goto Reference:="Start"
    Range("A1").Select
    
  EndZeile = Range("B1048576").End(xlUp).Row
zeile = 10
Do
    If Cells(zeile, 2) > "" Then Cells(zeile, 3) = "=R[-1]C+60*R4C2"
    zeile = zeile + 1
Loop Until zeile > EndZeile
    
Call Sverweis
Sheets("Auswertung").Select
Application.ScreenUpdating = True
End Sub
________________________________________________________________________
Sub Sverweis()
Sheets("Berechnungen").Select
Range("C2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    
EndZeile = Range("A500000").End(xlUp).Row
zeile = 2
Do
    If Cells(zeile, 1) > "" Then Cells(zeile, 3) = "=VLOOKUP(RC[-2],Eingabe!C:C[1],2,FALSE)"
    zeile = zeile + 1
Loop Until zeile > EndZeile
EndZeile = Range("A500000").End(xlUp).Row
zeile = 2
Do
    If Cells(zeile, 1) > "" Then Cells(zeile, 4) = "=RC[-2]-RC[-1]"
    zeile = zeile + 1
Loop Until zeile > EndZeile
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro sehr langsam
01.02.2023 11:32:18
Der
Hallo,
wundert mich nicht wirklich. Der Code fügt für jede Zelle einzeln eine Formel ein. Jeder Zellzugriff dauert. Damit ist das ganze sehr langsam. Zudem verwendest Du Select und Activate. Das ist langsam und außerdem in 99% aller Fälle unnötig.
Zudem ist ohne die Daten zu kennen nicht wirklich nachvollziehbar, was Du genau machst.
Stelle mal eine Beispieldatei bereit und erkläre was gemacht werden soll.
Gruß
Michael
AW: Makro sehr langsam
01.02.2023 11:37:24
Daniel
Hi
wenn du mal zeit hast, das hier lesen, verstehen und anwenden: https://online-excel.de/excel/singsel_vba.php?f=78
dein Hauptproblem ist aber, dass du in einer Schleife den SVerweis einzeln in jede Zelle einträgst.
Das ist dann im Prinzip so, wie wenn du, um 10 Brötchen zu kaufen, 10x zum Bäcker fährst und jedesmal 1 Brötchen kaufst, anstatt 1x zum Bäcker zu fahren und 10 Brötchen zu kaufen.
genauso ist es in Excel schneller, eine Formel in viele Zellen gleichzeitig einzutragen, als in jede Zelle einzeln.
daher anstelle der beiden DO-Schleifen dieses hier, die Bedingung nimmt man dann in die Formel mit auf, damit jede Zelle die gleiche Formel bekommt und so alle Zellen in einem Arbeitsgang gefüllt werden können:
hier mal für das Makro "SVerweis", die Do-Schleife im Makro "Berechnen" kann auf die gleiche Weise ersetzt werden.
With Sheets("Berechnungen")
    with .Range("C2:D" & .Cells(.Rows.count, 1).End(xlup).Row)
        .Columns(1).FormulaR1C1 = "=IF(RC1="""","""",VLOOKUP(RC[-2],Eingabe!C:C[1],2,FALSE))"
        .Columns(2).FormulaR1C1 = "=IF(RC1="""","""",RC[-2]-RC[-1])"
    end with
End with
Gruß Daniel
Anzeige
AW: Makro sehr langsam
01.02.2023 12:12:11
Bianca
Danke!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige