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
heje excelfreunde, schauan,

aus #8:

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

da liegst du völlige falsch, nicht die eigenen mutmaßungen/interpretationen sind gefragt, sonder das problem, welches dargestellt wurde...
und dessen elegantere, aber gleichwertigere umsetzung.
(04.09.2016, 09:58)Crazy Tom schrieb: [ -> ]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

Danke Tom!
Läuft in der Tat schneller, aber bei 147 Loops immer noch recht zeitaufwendig. Der Aufwand kommt von der Berechnung einiger Zellen in Abhängigkeit von B2.
Ich kann in meinem Modell die Variablen reduzieren, das hilft nochmal (siehe unten).
Gerne würde ich diese Idee weiterführen, sodass B2 für noch weniger Variablen verändert wird; allerdings bin ich mit einem IF im Loop nicht so weit gekommen. Von der Idee her sollte es so aussehen:
Code:
Sub WKN_Update()

Application.ScreenUpdating = False
  Dim i As Long
  With Sheets("WKN Data")
  For i = 1 To .Range("I3").Value
        If Left(.Cells(i + 4, 10).Value, 1) = " " Then Next i Else

        .Range("B2").Value = i
        .Cells(i + 4, 10).Value = .Range("C3").Value
        .Cells(i + 4, 11).Value = .Range("G3").Value
        End
  Next i
  End With

End Sub

Das Next i im Then geht aber leider nicht. Ideen?

Danke!!!
Hallo,

so?
Code:
Sub WKN_Update()

Application.ScreenUpdating = False
  Dim i As Long
  With Sheets("WKN Data")
   For i = 1 To .Range("I3").Value
      If Left(.Cells(i + 4, 10).Value, 1) <> " " Then

        .Range("B2").Value = i
        .Cells(i + 4, 10).Value = .Range("C3").Value
        .Cells(i + 4, 11).Value = .Range("G3").Value
      End If
   Next i
  End With

End Sub

Gruß Uwe
Wie sehen die Formel in C3 und G3 aus ?
Danke Uwe, das funktioniert top!
@snb:  Die Formeln lauten

=ROUND(INDEX(Performance!N$14:N$183,MATCH('WKN Data'!$C$4,Performance!$B$14:$B$183,0)),2)*100&"%"

und

=ROUND(OFFSET($G$4,COUNT($G$5:$G$1030),)/$G$5-1,2)*100&"%"

Meinst du, durch Berechnung in VBA wäre es vllt noch schneller?

Danke!
Ja, das meine ich.

In keinem der Formeln spielt B3 eine Rolle ???

Warum denn B3 ändern ?
Doch - B2-Bezüge sind natürlich indirekt in den anderen Formeln drin. Sonst würde es ja keinen Sinn machen.
B2 wird von einem Spin Button gefüttert, daher nicht direkt in den Formeln verlinkt. Basierend auf B2 werden entsprechende Daten in dem Sheet aufgerufen, die dann in C3 und G3 zusammengefasst werden.
Wenn es zu langsam läuft solltest du die ganze Berechnung zeigen. Das wird mit VBA viel schneller gehen.
Sorry, das Modell ist recht komplex, dauert wsh sehr lange bis man sich da eingearbeitet hat. Ich versuche mal mein Anliegen in Kurzform zu erklären :)

[
Bild bitte so als Datei hochladen: Klick mich!
]

B2 ist die durch den Spin Button getriggerte Zelle. Füttert C4 mit einem Namen
Datumspalte B zieht Daten aus einem anderen Sheet für diesen Namen: =INDEX(Overview!F$3:F$500,MATCH('WKN Data'!$C$4,Overview!$B$3:$B$500,0))
Spalten C-F ebenso, z.B.: =INDEX(Overview!$AA$3:$CO$5000,MATCH('WKN Data'!B6,Overview!$Z$3:$Z$5000,0),MATCH('WKN Data'!$C$4,Overview!$AA$2:$CO$2,0))
Spalte G berechnet auf Basis von D-F eine Zahl: =IFERROR(INDEX(D5:F5,,MATCH($G$4,$D$3:$F$3,0)),D5*Overview!$W$32+E5*Overview!$W$33+F5*Overview!$W$34)*$C$5

C3 zieht auf Basis von B2 eine Zahl aus einem anderen Sheet (aus meiner Sicht unkritisch): =ROUND(INDEX(Performance!N$14:N$183,MATCH('WKN Data'!$C$4,Performance!$B$14:$B$183,0)),2)*100&"%"
G3 ist wohl der Übeltäter, da für die Berechnung hier der gesamte Klatsch vornedran verwendet wird: =ROUND(OFFSET($G$4,COUNT($G$5:$G$1030),)/$G$5-1,2)*100&"%"

Was ich machen möchte: Alle Zahlen des Spin-Buttons durchgehen. Mit jeder Änderung gibt es neue C3 und G3 Werte. Diese möchte ich dann einfach nur in das entsprechende Feld J & K kopieren.

Ist das soweit verständlich? Falls ja, welche Idee hättest du, das direkt in VBA umzusetzen?

Vielen Dank und Grüße
Andreas
Hallo Andreas,

in Deinen Formeln ist immer noch kein Bezug zu B2 erkennbar Sad
Zur Umsetzung wäre es in diesem Fall ausnahmsweise hilfreich, eine Musterdatei zu posten.

Hier mal noch vorab die von snb vorgeschlagene Variabte mit dem Array auf Basis von Tom's Code:

Code:
Sub WKN_Update()
Dim i As Long, arrData(1 To 147, 1)
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
    arrData(i, 0) = .Range("C3").Value
    arrData(i, 1) = .Range("G3").Value
  Next i
  .Range(.Cells(1, 10), .Cells(147, 11)).Value = arrData()
End With
MsgBox "fertsch"
End Sub
Seiten: 1 2 3 4