For Next - Thema. Bin ratlos!

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: For Next - Thema. Bin ratlos!
von: Stefan
Geschrieben am: 20.11.2003 12:31:53

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.

Bild


Betrifft: AW: For Next - Thema. Bin ratlos!
von: ChrisL
Geschrieben am: 20.11.2003 12:38:12

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


Bild


Betrifft: AW: For Next - Thema. Bin ratlos!
von: Nayus
Geschrieben am: 20.11.2003 12:40:00

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


Bild


Betrifft: AW: For Next - Thema. Bin ratlos!
von: Nike
Geschrieben am: 20.11.2003 12:40:07

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


Bild


Betrifft: AW: Geht immernoch nicht
von: Stefam
Geschrieben am: 20.11.2003 12:51:07

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
()


Bild


Betrifft: AW: Geht immernoch nicht
von: Nayus
Geschrieben am: 20.11.2003 13:03:41

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


Bild


Betrifft: @Nayus
von: Stefan
Geschrieben am: 20.11.2003 13:05:55

Hi Nayus,

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

Gruß Stefan.


Bild


Betrifft: AW: @Nayus
von: Michael Scheffler
Geschrieben am: 20.11.2003 13:14:55

Hi,

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

Gruß

Micha


Bild


Betrifft: AW: @Nayus
von: ChrisL
Geschrieben am: 20.11.2003 13:16:47

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


Bild

Beiträge aus den Excel-Beispielen zum Thema " Tabellenblatt Namen in Zelle schreiben"