Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
340to344
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
340to344
340to344
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

For Next - Thema. Bin ratlos!

For Next - Thema. Bin ratlos!
20.11.2003 12:31:53
Stefan
Wertes Forum,

ich bin wirklich ratlos und weiß nicht mehr weiter, denn ein solches Problem hatte ich noch nie. Nun zum Problem: Ich habe folgenden Code (straff gekürzt)

*********

Dim I, LModD as long

For I = 2 to LModD
...
...
Next I

*********

LModD -> letzte Zeile einer Datei
I -> Zeilenzähler

So, nun passiert folgendes:

Wenn I den Wert 287 enthält, geht er aus der Schleife, obwohl LModD den Wert 431 enthält. Wie kann er dann aus der Schleife rausgehen? Hat jemand schon ähnliche Erfahrungen gemacht? Vielleicht liegts an der Variablendeklaration, aber warum geht er genau bei 287 raus, bei 286 bleibt er nocht drin ?

Danke schon mal im voraus.

Gruß Stefan.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For Next - Thema. Bin ratlos!
20.11.2003 12:38:12
ChrisL
Hi Stefan

Vielleicht springt er in einen On Error Goto Error rein? Mal den ErrorHandler rausnehmen.

Oder vielleicht hast du ein 'Exit For' oder 'Exit Sub' im Code.

Aufgrund deiner Angaben ist es die Suche nach der Nadel im Heuhaufen.

I übrigens als Long deklarieren, so wie du es hast ist es ein Variant.

Gruss
Chris
AW: For Next - Thema. Bin ratlos!
20.11.2003 12:40:00
Nayus
Hi,
die For-Next-Schleife funktioniert (siehe TestFor).
Wenn Dein Programm vorher aussteigt, passiert irgendetwas
anderes in der Schleife.
Entweder hast Du eine Abbruchbedingung erfüllt, die erreicht wird,
oder Dein Programm läuft auf einen Fehler, den Du generelle abfängst
(in der Form on error resume next oder ähnlich).


Sub testFor()
Dim I, LModD As Long
LModD = 400
For I = 2 To LModD
If I = 400 Then
MsgBox CStr(I)
End If
Next I
End Sub


Gruß,
Nayus
Anzeige
AW: For Next - Thema. Bin ratlos!
20.11.2003 12:40:07
Nike
Hi,
erst mal die richtige Deklaration wäre

Dim I as long ' sonst ist I vom Typ variant...
Dim LModD as long 'sicher das LModD 431 groß ist?
'Einfach mal mit F8 Schrittweise durch und die Maus drüberhalten,
'dann werden die Werte angezeigt oder halt die Überwachung einrichten

For I = 2 to LModD
'...
Next I

Mit exit for könntest du auch vorzeitig "aussteigen"
oder du hast ne Error behandlung drinnen und die greift,
weil irgendwo ein Fehler auftritt...

Bye

Nike
AW: Geht immernoch nicht
20.11.2003 12:51:07
Stefam
erstmal danke für euere Einträge.
also, ich habe weder eine Fehlerbehandlung drin (also mit on error oder so), und beide Variablen, also I und LModD sind als long deklariert. Verstehe ich nicht hier mal der ganze Code:


Sub ModErg()
Dim MatNr(4) As Long
Dim ModD, OrgD, Z, MatNrTxt(4) As String
Dim I, J, LModD, LNetz As Long
Dim PId(2), TPTyp, PTyp, TDN, STATUS, WUNSCH, IST As String
Dim EDSNR As Long
Dim Netz, PIDNetz, SL As String
MatNr(1) = 100  'Produkt1
MatNr(2) = 101  'Produkt2
MatNr(3) = 102  'Produkt3
MatNr(4) = 103  'Produkt4
MatNrTxt(1) = "Text1"
MatNrTxt(2) = "Text2"
MatNrTxt(3) = "Text3"
MatNrTxt(4) = "Text4"
Netz = "NetzwertExcel.xls"
Workbooks(Netz).Sheets(1).Activate
LNetz = Workbooks(Netz).Sheets(1).UsedRange.Rows.Count
EDSNR = 49999999
ModD = "Datei.xls"
OrgD = "ModListErg.xls"
Workbooks(ModD).Sheets(1).Activate
LModD = Workbooks(ModD).Sheets(1).UsedRange.Rows.Count
For I = 2 To LModD
EDSNR = EDSNR + 1
Workbooks(OrgD).Sheets(1).Activate
Rows("2:2").Select
Range("A2").Activate
Selection.Copy
Workbooks(ModD).Sheets(1).Activate
Cells(I, 1).Select
Selection.EntireRow.Insert
LModD = Workbooks(ModD).Sheets(1).UsedRange.Rows.Count
I = I + 1
PTyp = Workbooks(ModD).Sheets(1).Cells(I, 31).Value
PId(1) = Workbooks(ModD).Sheets(1).Cells(I, 12).Value
For J = 2 To LNetz
PIDNetz = Workbooks(Netz).Sheets(1).Cells(J, 3).Value
If PIDNetz = PId(1) Then
SL = Workbooks(Netz).Sheets(1).Cells(J, 8).Value
J = LNetz
End If
Next J
TDN = Workbooks(ModD).Sheets(1).Cells(I, 2).Value
STATUS = Workbooks(ModD).Sheets(1).Cells(I, 13).Value
WUNSCH = Workbooks(ModD).Sheets(1).Cells(I, 23).Value
IST = Workbooks(ModD).Sheets(1).Cells(I, 25).Value
Workbooks(ModD).Sheets(1).Cells(I - 1, 2).Value = TDN
Workbooks(ModD).Sheets(1).Cells(I - 1, 3).Value = EDSNR
Workbooks(ModD).Sheets(1).Cells(I - 1, 11).Value = PId(1) 'OrdnungsNr.
Workbooks(ModD).Sheets(1).Cells(I - 1, 13).Value = STATUS
Workbooks(ModD).Sheets(1).Cells(I - 1, 23).Value = WUNSCH
Workbooks(ModD).Sheets(1).Cells(I - 1, 25).Value = IST
Workbooks(ModD).Sheets(1).Cells(I - 1, 54).Value = SL
SL = ""
Workbooks(ModD).Sheets(1).Cells(I - 1, 56).Value = Right(TDN, 4)
TPTyp = Left(PTyp, 2)
Select Case TPTyp
Case "LM"
Workbooks(ModD).Sheets(1).Cells(I - 1, 43).Value = MatNr(1)
Workbooks(ModD).Sheets(1).Cells(I - 1, 44).Value = MatNrTxt(1)
Workbooks(ModD).Sheets(1).Cells(I - 1, 52).Value = PTyp & " Port"
If Left(PTyp, 3) = "LMS" Then
Workbooks(ModD).Sheets(1).Cells(I - 1, 50).Value = "LMS"
Else
Workbooks(ModD).Sheets(1).Cells(I - 1, 50).Value = "LM"
End If
Case "LR"
Workbooks(ModD).Sheets(1).Cells(I - 1, 43).Value = MatNr(2)
Workbooks(ModD).Sheets(1).Cells(I - 1, 44).Value = MatNrTxt(2)
Workbooks(ModD).Sheets(1).Cells(I - 1, 50).Value = "LR"
Workbooks(ModD).Sheets(1).Cells(I - 1, 52).Value = PTyp & " Port"
Case "LP"
Workbooks(ModD).Sheets(1).Cells(I - 1, 43).Value = MatNr(3)
Workbooks(ModD).Sheets(1).Cells(I - 1, 44).Value = MatNrTxt(3)
Workbooks(ModD).Sheets(1).Cells(I - 1, 50).Value = "LP"
Workbooks(ModD).Sheets(1).Cells(I - 1, 52).Value = PTyp & " Port"
Case Else
Workbooks(ModD).Sheets(1).Cells(I - 1, 43).Value = MatNr(4) 'Auslandsports
Workbooks(ModD).Sheets(1).Cells(I - 1, 44).Value = MatNrTxt(4)
Workbooks(ModD).Sheets(1).Cells(I - 1, 50).Value = "AP"
Workbooks(ModD).Sheets(1).Cells(I - 1, 52).Value = PTyp
End Select
PId(1) = Workbooks(ModD).Sheets(1).Cells(I, 12).Value
PId(2) = Workbooks(ModD).Sheets(1).Cells(I + 1, 12).Value
Do While PId(2) = PId(1)
I = I + 1
PId(2) = Workbooks(ModD).Sheets(1).Cells(I + 1, 12).Value
Loop
Next I
End Sub
()
Anzeige
AW: Geht immernoch nicht
20.11.2003 13:03:41
Nayus
Hi,
du inkrementierst mehrmals Schleifenzähler innerhalb der Schleife.
Dies führt zu schwer nachvollziehbaren Indizes und fast sicher zu ungewünschten
Ergebnissen.
Nimm' also eigene Variablen für das, was Du vorhast und lass' "I" und "J" in den Schleifen in Ruhe.

Beispiel:
FOR I = 2 To LModD
...
I = I + 1 'Nix gut!!!!!
...
NEXT i

Gruß,
Nayus
@Nayus
20.11.2003 13:05:55
Stefan
Hi Nayus,

meinste wirklich, dass das daran liegt? Ich probiers mal aus, muss ich´s halt a bissl umschreiben.

Gruß Stefan.
AW: @Nayus
20.11.2003 13:14:55
Michael Scheffler
Hi,

verändere NIE bei einer For-Next-Schleife den Zähler, bei anderen Programmiersprachen warnt der Compiler!!!

Gruß

Micha
Anzeige
AW: @Nayus
20.11.2003 13:16:47
ChrisL
Hi Stefan

Glaube ebenfalls dass es daran liegt, insbesondere im Teil Do While...Loop.

Zwar ungetestet, aber mal die Variablen ein bischen gesäubert. z.B.
Dim X, Y As Long
X = Variant
Y = Long

Anyway...

Option Explicit


Sub ModErg()
Dim MatNr(4) As Long
Dim Z As String, MatNrTxt(4) As String
Dim I As Long, J As Long, LModD As Long, LNetz As Long
Dim PId(2) As String, TPTyp As String, PTyp As String, TDN As String, STATUS As String, WUNSCH As String, IST As String
Dim EDSNR As Long
Dim PIDNetz As String, SL As String
Dim WBNetz  As Workbook, WBModD As Workbook, WBOrgD As Workbook
Dim WSNetz As Worksheet, WSModD As Worksheet, WSOrgD As Worksheet
MatNr(1) = 100  'Produkt1
MatNr(2) = 101  'Produkt2
MatNr(3) = 102  'Produkt3
MatNr(4) = 103  'Produkt4
MatNrTxt(1) = "Text1"
MatNrTxt(2) = "Text2"
MatNrTxt(3) = "Text3"
MatNrTxt(4) = "Text4"
Set WBNetz = Workbooks("NetzwertExcel.xls")
Set WBModD = Workbooks("ModListErg.xls")
Set WBOrgD = Workbooks("ModListErg.xls")
Set WSNetz = WBModD.Worksheets(1)
Set WSModD = WBModD.Worksheets(1)
Set WSOrgD = WBOrgD.Worksheets(1)
LNetz = WSNetz.UsedRange.Rows.Count
EDSNR = 49999999
LModD = WSModD.UsedRange.Rows.Count
For I = 2 To LModD
EDSNR = EDSNR + 1
WSOrgD.Rows("2:2").Copy
WSModD.Activate
Cells(I, 1).Select
Selection.EntireRow.Insert
LModD = WSModD.UsedRange.Rows.Count
I = I + 1
PTyp = WSModD.Cells(I, 31).Value
PId(1) = WSModD.Cells(I, 12).Value
For J = 2 To LNetz
PIDNetz = WSNetz.Cells(J, 3).Value
If PIDNetz = PId(1) Then
SL = WSNetz.Cells(J, 8).Value
J = LNetz
End If
Next J
TDN = WSModD.Cells(I, 2).Value
STATUS = WSModD.Cells(I, 13).Value
WUNSCH = WSModD.Cells(I, 23).Value
IST = WSModD.Cells(I, 25).Value
WSModD.Cells(I - 1, 2).Value = TDN
WSModD.Cells(I - 1, 3).Value = EDSNR
WSModD.Cells(I - 1, 11).Value = PId(1) 'OrdnungsNr.
WSModD.Cells(I - 1, 13).Value = STATUS
WSModD.Cells(I - 1, 23).Value = WUNSCH
WSModD.Cells(I - 1, 25).Value = IST
WSModD.Cells(I - 1, 54).Value = SL
SL = ""
WSModD.Cells(I - 1, 56).Value = Right(TDN, 4)
TPTyp = Left(PTyp, 2)
Select Case TPTyp
Case "LM"
WSModD.Cells(I - 1, 43).Value = MatNr(1)
WSModD.Cells(I - 1, 44).Value = MatNrTxt(1)
WSModD.Cells(I - 1, 52).Value = PTyp & " Port"
If Left(PTyp, 3) = "LMS" Then
WSModD.Cells(I - 1, 50).Value = "LMS"
Else
WSModD.Cells(I - 1, 50).Value = "LM"
End If
Case "LR"
WSModD.Cells(I - 1, 43).Value = MatNr(2)
WSModD.Cells(I - 1, 44).Value = MatNrTxt(2)
WSModD.Cells(I - 1, 50).Value = "LR"
WSModD.Cells(I - 1, 52).Value = PTyp & " Port"
Case "LP"
WSModD.Cells(I - 1, 43).Value = MatNr(3)
WSModD.Cells(I - 1, 44).Value = MatNrTxt(3)
WSModD.Cells(I - 1, 50).Value = "LP"
WSModD.Cells(I - 1, 52).Value = PTyp & " Port"
Case Else
WSModD.Cells(I - 1, 43).Value = MatNr(4) 'Auslandsports
WSModD.Cells(I - 1, 44).Value = MatNrTxt(4)
WSModD.Cells(I - 1, 50).Value = "AP"
WSModD.Cells(I - 1, 52).Value = PTyp
End Select
PId(1) = WSModD.Cells(I, 12).Value
PId(2) = WSModD.Cells(I + 1, 12).Value
Do While PId(2) = PId(1)
I = I + 1
PId(2) = WSModD.Cells(I + 1, 12).Value
Loop
Next I
End Sub


Gruss
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige