Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1796to1800
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

For-Schleife endet zu früh

For-Schleife endet zu früh
15.12.2020 13:19:23
Sybot
Hallo zusammen,
ich habe ein Problem mit einer For-Schleife. Die Schleife soll 6 mal durchlaufen werden, aber sie endet bereits nach dem 5. Durchlauf. Da der ganze Code viel zu lange wäre und außerdem auf ein anderes Program via COM-Schnittstelle zugreift, habe ich nur die betreffende Schleife unten angegeben. Die Variable intAnzStellen wird auf 6 gesetzt. Der Code läuft bis II = 4 wie gedacht durch. Beim erreichen des Next II wird der Wert für II auch auf 5 erhöht, nur die Schleife wird nicht erneut durchlaufen. Kann sich da irgendjemand einen Reim drauf machen?

For II = 0 To intAnzStellen - 1
'ermittelt die Anzahl der auszugebenden Stäbe
intAnzStaebe = WorksheetFunction.CountIf(wksSteuerung.Range(wksSteuerung.Cells( _
conListeZeile1, conListeSpalte1 - 1), _
wksSteuerung.Cells(conListeZeile1 + conStaebeMAX, conListeSpalte1 - 1)), "Stelle " & _
II + 1)
ReDim strEKs(intAnzStaebe - 1, 0)
For JJ = 0 To intAnzStaebe - 1
strEK1 = listeInArray(wksSteuerung.Cells(conListeZeile1 + JJ + intStartZStelle,  _
conListeSpalteEKs).Value)
If Not wksSteuerung.Cells(conListeZeile1 + JJ + intStartZStelle, conListeSpalteEKs). _
Value = "" Then
If UBound(strEK1) > UBound(strEKs, 2) Then ReDim Preserve strEKs(intAnzStaebe -  _
1, UBound(strEK1))
For KK = 0 To UBound(strEK1)
strEKs(JJ, KK) = strEK1(KK)
Next KK
End If
Next JJ
For JJ = 0 To intAnzStaebe - 1
For KK = 0 To UBound(strEKs, 2)
If strEKs(JJ, KK)  "" Then
For Each wks In ThisWorkbook.Sheets
If wks.Name = "Stelle " & II + 1 & " - " & strEKs(JJ, KK) Then GoTo  _
weiter3
Next
ReDim intEKPos(UBound(intEKPos) + 1)
ReDim Preserve strEK2(UBound(strEK2) + 1)
strEK2(UBound(strEK2) - 1) = strEKs(JJ, KK)
wksT1.Visible = True
wksT1.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wksErg = ThisWorkbook.ActiveSheet
wksErg.Name = "Stelle " & II + 1 & " - " & strEKs(JJ, KK)
wksT1.Visible = False
End If
weiter3:
Next KK
Next JJ
intStartZStelle = intStartZStelle + JJ
Next II




		

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For-Schleife endet zu früh
15.12.2020 13:32:05
Daniel
Hi
sind die Variablen II und intAnzStellen als Ganzzahl (Long oder Integer) deklariert?
eine mögliche Erklärung wäre, dass aufgrund der generellen Rechnenungenauigkeit von Computern bei " intAnzStellen - 1" nicht 5 das Ergebnis ist, sondern 4,9999999999987988 und dann bei II = 5 der Endwert schon überschritten ist.
warum rechnest du überhaupt?
du verwendest im Code immer II+1, wenn du II direkt verwendest, ist die Schleife:
For II = 1 To intAnzStellen
damit vermeidest du unnötige Berechungen. Du müsstest dann halt jedes II in der Schleife durch II-1 ersetzen, aber für deine Schleife selbst hast du unnötige Berechnungen vermieden.
oder mach: For II = 0 To intAnzStellen - 0.5
bei Step 1 sollte das den gleichen effektiven Endwert ergeben wie -1 und du hast genügend Abstand, so dass die o.g. genannten Ungenauigkeiten nicht wirksam werden.
Gruß Daniel
Anzeige
AW: For-Schleife endet zu früh
15.12.2020 13:41:58
Sybot
Hallo Daniel,
II und intAnzStellen sind beide als Integer deklariert. Wie schon gesagt habe ich den Code (auch innerhalb der Schleife) gekürzt. Das Problem taucht aber auch in der verkürzten Version auf. II wird auch für den Index von Arrays verwendet, weswegen mir der Start bei 0 sinnvoller vorkommt.
Gruß
Saybot
AW: For-Schleife endet zu früh
15.12.2020 18:44:34
Yal
Hallo Sybot,
Sprungmarke sind ein empfindliches Werkzeug.
Bei deiner Schleife
For Each wks In ThisWorkbook.Sheets
If wks.Name = "Stelle " & II + 1 & " - " & strEKs(JJ, KK) Then GoTo weiter3
Next

geht es eigentlich nur darum zu prüfen, ob eine Worksheet mit dem Namen existiert, und wenn ja nichts tun, richtig?
Dann stelle eine fehlertolerante Function dafür:
Private Function Worksheet_exists(WSName As String) As Boolean
'wenn Fehler, = not exists, => False
Dim W
On Error Resume Next
Set W = ThisWorkbook.Worksheets(WSName)
Worksheet_exists = Not (W Is Nothing)
End Function
Dann kannst Du das ganze ohne for und ohne Sprungmarke gestalten:
For JJ = 0 To intAnzStaebe - 1
For KK = 0 To UBound(strEKs, 2)
If strEKs(JJ, KK)  "" Then
If Not Worksheet_exists("Stelle " & II + 1 & " - " & strEKs(JJ, KK)) Then
ReDim intEKPos(UBound(intEKPos) + 1)
ReDim Preserve strEK2(UBound(strEK2) + 1)
strEK2(UBound(strEK2) - 1) = strEKs(JJ, KK)
wksT1.Visible = True
wksT1.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wksErg = ThisWorkbook.ActiveSheet
wksErg.Name = "Stelle " & II + 1 & " - " & strEKs(JJ, KK)
wksT1.Visible = False
End If
End If
Next KK
Next JJ

Ob das der Grund für den Abbruch, ist mir nicht klar. Übliche Verdächtigen, eben.
Der Rest sieht aus der Ferne mMn sauber aus. Ich kann nichts entdecken.
Viel Erfolg
Yal
Anzeige
AW: For-Schleife endet zu früh
16.12.2020 08:49:18
Sybot
Hallo,
Das mit der Sprungmarke hatte ich auch schon ausprobiert, hat aber nichts geändert. Ich bin aber mittlerweile auf die Lösung gekommen. Bei der Berechnung intAnzStellen - 1 kommt anscheinend kein Integer bei raus. Bei der Prüfung im Direktfenster sah es zwar so aus, wenn ich aber den Ausdruck so schreibe CInt(intAnzStellen - 1), läuft das Programm wie gewollt.
Danke nochmal an alle, die sich das angeschaut haben.
Schöne Grüße
Sybot
AW: For-Schleife endet zu früh
16.12.2020 09:05:29
Daniel
also so, wie ich dir geschrieben habe?
Gruß Daniel
AW: For-Schleife endet zu früh
16.12.2020 09:16:32
Sybot
Ja, hatte es wiegesagt erst im Direktfenster geprüft und als da 5 und nicht 4.99999999999 rauskam hatte ich das erst verworfen.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige