Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1344to1348
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
Do Until Schleife richtige Wahl?
12.01.2014 11:53:02
Udo
Hallo zusammen,
ich habe ein kleines Tool geschrieben, dass Daten auswertet:
Dim Anzahl As Integer
Dim IntZeile2 As Double
Dim Erg2 As Double
Erg2 = 4
IntZeile2 = 2 + (TextBox49.Text * TextBox9.Text)
Do Until IntZeile2 = Sheets("SETUP").Range("F5") - 1
If Sheets("DATA").Cells(IntZeile2, 5).Value >= Sheets("SETUP").Cells(5, 5).Value And Sheets("DATA").Cells(IntZeile2 + 1, 5).Value DoEvents
Sheets("EVALUATION_RI1").Cells(Erg2, 8).Value = Sheets("DATA").Cells(IntZeile2, 1).Value
Sheets("EVALUATION_RI1").Cells(Erg2, 9).Value = Sheets("DATA").Cells(IntZeile2, 5).Value
Erg2 = Erg2 + 1
End If
IntZeile2 = IntZeile2 + 1
Loop
Die Daten sind bis zu 136.100 Zeilen lang. Ist für so eine große Datenmenge die Do Until Loop Schleife die schnellste Möglichkeit?
Vielen Dank im vorraus.
gruß
Udo

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Do Until Schleife richtige Wahl?
12.01.2014 12:07:43
Raphael
Hallo Udo,
ich denke die Schleifenwahl wird hier keine grossen unterschiede in der Geschwindigkeit bringen.
Wenn du es schneller willst solltest du die Sheets in Arrays einlesen und mit diesen arbeiten.
Falls du nicht weisst wie es gehen könnte lad doch eine BspDatei hoch, dann kann ich es dir anhand von der zeigen.
Gruess
Raphael

AW: Do Until Schleife richtige Wahl?
12.01.2014 14:14:45
Udo
Hallo Raphael,
Vielen Dank für die schnelle Antwort. Wie das mit Arrays funktioniert weiß ich leider nicht.
Anbei eine Beispieldatei.
https://www.herber.de/bbs/user/88778.xlsm
gruß
Udo

Anzeige
AW: Do Until Schleife richtige Wahl?
12.01.2014 20:10:06
Udo
Hallo Raphael,
der Tip mit dem Array war wirklich Gold Wert. Ich denke ich hab's hinbekommen. Ich konnte die Auswertung von 85s auf 30s reduzieren.
Vielen Dank nochmal.
gruß
Udo

AW: Do Until Schleife richtige Wahl?
13.01.2014 08:29:37
Raphael
Hallo Udo,
freut mich das ich dir helfen konnte. Poste doch deinen Code mal hier. Denn 30s sind eigentlich noch immer ziemlich lange...... (werde dir aber erst heute Abend eine Antwort geben können ca. 22.00 Uhr).
Als erneuter Denkanstoss:
Daten in Array lesen, die Resultat bzw. Änderungen ebenfalls in ein Array schreiben und erst wenn die Schleife durchgelaufen ist, dann das komplette Array ins Excelblatt schreiben.
Gruess
Raphael

Anzeige
AW: Do Until Schleife richtige Wahl?
13.01.2014 10:52:51
Rudi
Hallo,
teste mal:
Private Sub CommandButton1_Click()
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'XXXXXXXX INTAKE 1 CURRENT ON XXXXXXX
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Dim lngZeile As Long
Dim lngErg As Long
Dim dblVergleich As Double, arrTmp, arrErg()
Dim lngLastRow
Application.Calculation = xlCalculationManual
dblVergleich = Sheets("SETUP").Cells(8, 3)
arrTmp = Sheets("Da ta").Cells(1, 1).CurrentRegion
lngLastRow = Sheets("SETUP").Range("F5")
ReDim arrErg(1 To 6, 1 To lngLastRow)
lngZeile = 2
For lngZeile = 2 To lngLastRow
If arrTmp(lngZeile, 9).Value   _
dblVergleich Then
lngErg = lngErg + 1
arrErg(1, lngErg) = arrTmp(lngZeile, 1)
arrErg(2, lngErg) = arrTmp(lngZeile, 2)
arrErg(3, lngErg) = WorksheetFunction.Average(arrTmp(lngZeile, 3), arrTmp(lngZeile - 5, 3) _
)
arrErg(lngErg, 5) = arrTmp(lngZeile, 4)
arrErg(lngErg, 6) = arrTmp(lngZeile, 5)
arrErg(lngErg, 7) = arrTmp(lngZeile, 9)
End If
Next
ReDim Preserve arrErg(1 To 6, 1 To lngErg)
Sheets("EVALUATION_RI1").Cells(4, 8).Resize(lngErg, 6) = WorksheetFunction.Transpose(arrErg)
End Sub

Gruß
Rudi

Anzeige
AW: Do Until Schleife richtige Wahl?
13.01.2014 14:06:25
Erich
Hi Udo,
und noch eine Version:

Option Explicit
Private Sub CommandButton1_Click()
Dim arQ, dV83 As Double, arZ() As Double, arE() As Double
Dim qq As Long, arAV(5), iAV As Long, zz As Long
With Sheets("SETUP")
arQ = Sheets("DATA").Cells(2, 1).Resize(.Range("F5") + 1, 9).Value
dV83 = .Cells(8, 3).Value
End With
ReDim arZ(1 To UBound(arQ), 2 To 7)
For qq = 1 To UBound(arQ) - 1
arAV(iAV) = arQ(qq, 3)
If arQ(qq, 9)  dV83 Then
zz = zz + 1
arZ(zz, 2) = arQ(qq, 1)
arZ(zz, 3) = arQ(qq, 2)
If qq > 5 Then arZ(zz, 4) = Application.Average(arAV)
arZ(zz, 5) = arQ(qq, 4)
arZ(zz, 6) = arQ(qq, 5)
arZ(zz, 7) = arQ(qq, 9)
End If
iAV = iAV + 1
If iAV > 5 Then iAV = 0
Next qq
ReDim arE(1 To zz, 2 To 7)
For qq = 1 To UBound(arE)
For zz = 2 To 7
arE(qq, zz) = arZ(qq, zz)
Next zz
Next qq
Sheets("EVALUATION_RI1").Cells(4, 2).Resize(UBound(arE), 6) = arE
Sheets("EVALUATION_RI1").Select  ' nur wenn nötig/gewünscht
End Sub
@Rudi:
Schau doch noch mal nach, worüber der Durchschnitt gebildet wird - IMHO über 6 Werte, nicht 2.
Die Indizes für arrErg(4, 5, 6 passen in deinem Code noch nicht wirklich. :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Do Until Schleife richtige Wahl?
13.01.2014 18:44:41
Udo
Hallo Raphael, Hallo Erich, Hallo Rudi,
vielen Dank für eure Vorschläge. Es sieht wirklich so aus als ob immer noch potenzial da ist. Ich werde eure Vorschläge testen und Rückmeldung geben.
Vielen Dank
gruß
Udo

AW: Do Until Schleife richtige Wahl?
16.01.2014 16:30:41
Udo
Hallo Erich,
ich habe deine Version getestet und mittlerweile mit großem Ergolg implementiert. Ich bin jetzt in der Lage 4 Auswertungen in 27s zu machen (zu Beginn war ich bei 2min/Auswertung).
Vielen Dank nochmal.
Eine Frage habe ich allerdings noch:
Ich bin nicht dahintergestiegen wie und aus wieviel Werten der Mittelwert gebildet wird? Könntest du mir das bitte nochmal erklären? Ich würde bei der Mittelwertbildung die Anzahl der Werte gern dem User überlassen (Werte den er in eine TextBox schreibt). Geht das?
mit freundlichen Grüßen
Udo

Anzeige
Variables Array für Mittelwert
16.01.2014 18:06:47
Erich
Hi Udo,
ja, das ist kein Problem:

Private Sub CommandButton1_Click()
Dim arQ, dV83 As Double, arZ(), arE()
Dim qq As Long, arAV(), aAV As Integer, iAV As Integer, zz As Long
' tbMwAnz: TextBox zur Eingabe der Anzahl für Mittelwert (>=2)
If Not IsNumeric(tbMwAnz) Then Exit Sub   ' hier könnte eine Fehlermeldung hin
aAV = CInt(tbMwAnz) - 1
If aAV  dV83 Then
zz = zz + 1
arZ(zz, 2) = arQ(qq, 1)
arZ(zz, 3) = arQ(qq, 2)
If qq > aAV Then arZ(zz, 4) = Application.Average(arAV)
arZ(zz, 5) = arQ(qq, 4)
arZ(zz, 6) = arQ(qq, 5)
arZ(zz, 7) = arQ(qq, 9)
End If
iAV = iAV + 1
If iAV > aAV Then iAV = 0
Next qq
ReDim arE(1 To zz, 2 To 7)
For qq = 1 To UBound(arE)
For zz = 2 To 7
arE(qq, zz) = arZ(qq, zz)
Next zz
Next qq
Sheets("EVALUATION_RI1").Cells(4, 2).Resize(UBound(arE), 6) = arE
Sheets("EVALUATION_RI1").Select  ' nur wenn nötig/gewünscht
End Sub
arAV ist das Array, über das der MV gebildet wird. Es wird deklariert mit ReDim arAV(0 To aAV)
und hat damit aAV+1 Plätze (so viele wie der User in tbMwAnz eingegeben hat).
Gehen wir mal von der Eingabe 4 aus. aAV ist dann 3.
Am Anfang ist das Array leer. In der qq-Schleife werden nacheinander mit
arAV(iAV) = arQ(qq, 3)
für qq=1,2,3,4 die Plätze
arAV(0) , arAV(1) , arAV(2) , arAV(3) gefüllt mit den Werten
arQ(1, 3),arQ(2, 3),arQ(3, 3),arQ(4, 3).
Der Index iAV wächst mit "iAV = iAV + 1" von 0 auf 4, wird dann mit
"If iAV > aAV Then iAV = 0" wieder auf 0 gesetzt.
Das bewirkt, dass für qq=5 der Wert arQ(5, 3) in arAV(0) kommt.
Alles klar?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige