Clever-Excel-Forum

Normale Version: Loop sehr langsam
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hallo zusammen,

ich habe ein Makro aufgezeichnet und einen Loop draus gebaut. Der läuft allerdings super langsam - habt ihr vielleicht Tipps, wie man den Code optimieren kann?


Code:
Sub WKN_Update()

Application.ScreenUpdating = False

Dim i As Integer

Sheets("WKN Data").Select

For i = 1 To 147

    Range("B2").Select
    ActiveCell.FormulaR1C1 = i
    Range("C3").Select
    Selection.Copy
    Cells(i + 4, 10).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("G3").Select
    Selection.Copy
    Cells(i + 4, 11).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Next i

Sheets("Overview").Select
Range("A1").Select


End Sub

Schonmal vielen Dank im Voraus, freue mich auf eure Antworten!
Danke und viele Grüße
Andreas
Hallo

ich gehe mal davon aus, dass während der Schleife in den Zellen C3 und G3
Berechnungen stattfinden
dann wäre das ein Geschwindigkeitsgewinn

Code:
Sub WKN_Update()
   Dim i As Long
   Dim oldCalc
With Application
   .ScreenUpdating = False
   oldCalc = .Calculation
   .Calculation = xlCalculationManual
   .EnableEvents = False
End With
   With Sheets("WKN Data")
   For i = 1 To 147
       .Range("B2").Value = i
       .Cells(i + 4, 10).Value = .Range("C3").Value
       .Cells(i + 4, 11).Value = .Range("G3").Value
   Next i
   End With
With Application
   .ScreenUpdating = True
   .Calculation = oldCalc
   .EnableEvents = True
End With
   MsgBox "fertsch"
End Sub

ansonsten würde das hier schon reichen

Code:
Sub test()
   With Sheets("WKN Data")
       .Range("J5:J151").Value = .Range("C3").Value
       .Range("K5:K151").Value = .Range("G3").Value
   End With
End Sub

MfG Tom
heje excelfreunde,

oder dieser vorschlag:


Code:
Public Sub WKN_Update_02()
Dim WSWKN As Worksheet
Dim WSOV As Worksheet
Dim lngZL01 As Long              'ZeilenZaehler, entspricht "i"
Dim lngSP01 As Long              'SpaltenZaehler
Dim lngLZ01 As Long              'Letzte Zeile
 
  On Error GoTo Fehler
  With Application
     .Calculation = xlCalculationAutomatic
     .ScreenUpdating = False
  End With
  Set WSWKN = Application.Worksheets("WKN Data")
  Set WSOV = Application.Worksheets("Overview")
  lngSP01 = 10
  lngLZ01 = 147
  With WSWKN
     For lngZL01 = 1 To lngLZ01 Step 1
        .Cells(2, 2) = lngZL01
        .Cells(lngZL01 + 4, lngSP01) = .Cells(3, 3)
        .Cells(lngZL01 + 4, lngSP01 + 1) = .Cells(3, 7)
     Next lngZL01
  End With
  With Application
     .GoTo Reference:=WSWKN.Range("A1"), Scroll:=True
     .GoTo Reference:=WSOV.Range("A1"), Scroll:=True
     .Calculation = xlCalculationAutomatic
     .ScreenUpdating = True
  End With
  Set WSWKN = Nothing
  Set WSOV = Nothing
  On Error GoTo 0
  Exit Sub

Fehler:
  If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & " " & Err.Description
  'Resume Next
End Sub
Hallöchen,
Ich glaube, es sollen die berechneten Ergebnisse bei jedem Schleifendurchgang übernommen werden. Da wäre ein Abschalten der Berechnungsautomatik kontraproduktiv. Man könnte aber schauen, ob es ausreicht, die Formel(n) im VBA umzusetzen.
Moinmoin

war wohl noch etwas früh heut morgen :D
klar sollte die Berechnung da automatisch bleiben

aber so sollte es auch schnell genug sein

Code:
Sub WKN_Update()
  Dim i As Long
  With Sheets("WKN Data")
  For i = 1 To 147
      .Range("B2").Value = i
      .Cells(i + 4, 10).Value = .Range("C3").Value
      .Cells(i + 4, 11).Value = .Range("G3").Value
  Next i
  End With
  MsgBox "fertsch"
End Sub

MfG Tom
heje excelfreunde,

es wurde nach einer schnellen ausführung gefragt und nicht nach permanenter berechung der arbeitsmappe beim datentransfer.
es werden lediglich daten transferiert und ein calculate am am anfang und ende würden ebenfalls eine vollständige berechnung ausführen...
Langsam ???


Code:
Sub M_snb()
  With Sheets("WKN Data").Range("C3:C150")
    .Offset(4, 10) = .Value
    .Offset(4, 14) = .Offset(, 4).Value
  End With
End Sub
Hallo Janosch,

wenn Du Deine Ansicht konsequent verfolgst, würde es ggf. reichen, die 147 am Ende der Schleife in B2 einzutragen.

Für die ständigen Einträge in diese Zelle gibt es aus meiner Sicht nur zwei Gründe.
Entweder wird nach jedem Eintrag etwas auf Basis dieser Zelle berechnet, oder der TE möchte eine Art Log, um zu sehen, ob der Ablauf irgendwo hängen bleibt.

Um hier die richtige Entscheidung mit 100%iger Sicherheit zu treffen, fehlt eine entsprechende Beschreibung. Ich für meinen Teil tendiere zur Berechnung, da ich im Moment keinen Grund sehe, warum der Code zwischendrin abbrechen sollte.
Hallo,

ich bin immer wieder beeindruckt, wie eine Frage und/oder bestehender VBA-Code (fehl)interpretiert werden kann.  :17:
Toms Vesion in Beitrag #5 sollte passen. Ich hätte ScreenUpdating = False jedoch drin gelassen.

Gruß Uwe
Ich bin immer wieder beeindrückt wie eine TS/OP meint Fragen stellen zu können ohne komplette Information (d.h. eine Beispieldatei) zu Verfügung zu stellen. Die Helfer sind nur 'guessing'.

Die 'Lösung' in #5 könnte viel effizienter sein in einem Array; aber dazu muss mann die Formel im Arbeitsblatt kennen.
Seiten: 1 2 3 4