[VBA] Problematik Schleife in Schleife

Lasersword

Cadet 4th Year
Registriert
Jan. 2008
Beiträge
123
Guten Morgen zusammen,

ich habe ein Problem mit meiner Schleife (Code möchte ich erstmal nicht posten).

Was möchte ich?
Wir haben eine Übersicht unsere Rechnungen und einen Forecast.
Den Forecast möchte ich gerne aufgrund der aktuellen Rechnungen aktualisieren.

Also habe ich 2 Schleifen erstellt.

Die erste (for i = 1 to LZeile) fängt halt in der ersten Zeile des Forecastes an
und definiert die Suchkriterien (Art der Rechnung, Bezeichnung des Artikels, etc).

Danach kommt die zweite Schleife (for x = 1 to RLZeile), welche dann ich die Rechnungsübersicht
geht und sich die passende "Vergleichsrechnung" sucht.

Und das funktioniert auch.
Allerdings nur 10 Mal und danach nicht mehr.

Vor jedem "Next i" und "Next x" habe ich ein "DoEvents" gesetzt.

Jetzt kommt es aber.

Wenn ich in den Code gehe und eine Haltemarke setze und
dann Schritt für Schritt weiter mache, werden auch die restlichen Daten gezogen.

Jetzt meine Frage:
Warum laufen die Schleifen automatisch nicht durch,
manuell aber schon?

Habe ihr eine Idee?

VG,
Lasersword
 
Merkste selbst, oder ? Ohne Code (wenn auch nur ein Auszug) kann man dir eher weniger gut helfen.
 
  • Gefällt mir
Reaktionen: jonderson
Hast du zufällig die Möglichkeit nen Pseudocode zu posten? Muss ja nicht eure Firmenalgorithmen enthalten aber die Struktur der Schleifen und dafür wichtigen Methoden wäre schon nett...
 
Code:
Sub Forecast()

Dim FLZeile As Long
Dim RLZeile As Long
Dim i As Long
Dim x As Long
Dim aMonat As Integer
Dim FMonat As Integer
Dim FTag As Integer
Dim ZMonat As Integer
Dim ZDatum As Date
Dim ZDatum1 As String
Dim Krit1 As String
Dim Krit2 As String
Dim Krit3 As String
Dim Krit4 As String
Dim Krit5 As String
Dim Krit6 As String
Dim Krit7 As String
Dim Wert1 As Variant
Dim Wert2 As Variant
Dim Wert3 As Variant
Dim Wert4 As Variant
Dim Wert5 As Variant
Dim ZKrit1 As String
Dim ZKrit2 As String
Dim ZKrit3 As String
Dim ZKrit4 As String
Dim ZKrit5 As String
Dim ZKrit6 As String
Dim ZKrit7 As String
Dim VDatum As Date
Dim VDatum1 As String

'Application.ScreenUpdating = False


'letzte Zeile in Rechnungsübersicht
Sheets("Rechnungen").Select
RLZeile = Range("B65000").End(xlUp).Row

'letzte Zeile im Forecast
Sheets("Forecast").Select
FLZeile = Range("B65000").End(xlUp).Row

'aktueller Monat
aMonat = Month(Date)

'Forecast kann erst frühestens im April erstellt werden.
If aMonat < 4 Then
MsgBox "Es ist noch zu früh in diesem Jahr, um einen Forecast zu erstellen!" & vbCrLf & vbCrLf & _
"Bitte benutze die Vorjahreswerte!"
Exit Sub
End If


For i = 2 To FLZeile

If Range("O" & i).Value <> "" And _
   Month(Range("M" & i).Value) >= aMonat Then
   Krit1 = Range("B" & i).Value
   Krit2 = Range("D" & i).Value
   Krit3 = Range("F" & i).Value
   Krit4 = Range("G" & i).Value
   Krit5 = Range("U" & i).Value
   Krit6 = Range("V" & i).Value
   Krit7 = Range("W" & i).Value
   FTag = Day(Range("M" & i).Value)
   FMonat = Month(Range("M" & i).Value)
  
        Select Case aMonat
        
        Case 4
        If FMonat = 4 Then
           ZMonat = 2
        ElseIf FMonat = 5 Then
               ZMonat = 2
        ElseIf FMonat = 6 Then
               ZMonat = 3
        ElseIf FMonat = 7 Then
               ZMonat = 2
        ElseIf FMonat = 8 Then
               ZMonat = 2
        ElseIf FMonat = 9 Then
               ZMonat = 3
        ElseIf FMonat = 10 Then
               ZMonat = 2
        ElseIf FMonat = 11 Then
               ZMonat = 2
        ElseIf FMonat = 12 Then
               ZMonat = 3
        End If
  
            Case 5
            If FMonat = 5 Then
               ZMonat = 2
            ElseIf FMonat = 6 Then
                   ZMonat = 3
            ElseIf FMonat = 7 Then
                   ZMonat = 4
            ElseIf FMonat = 8 Then
                   ZMonat = 2
            ElseIf FMonat = 9 Then
                   ZMonat = 3
            ElseIf FMonat = 10 Then
                   ZMonat = 4
            ElseIf FMonat = 11 Then
                   ZMonat = 2
            ElseIf FMonat = 12 Then
                   ZMonat = 3
            End If
            
                Case 6
                If FMonat = 6 Then
                   ZMonat = 3
                ElseIf FMonat = 7 Then
                       ZMonat = 4
                ElseIf FMonat = 8 Then
                       ZMonat = 2
                ElseIf FMonat = 9 Then
                       ZMonat = 3
                ElseIf FMonat = 10 Then
                       ZMonat = 4
                ElseIf FMonat = 11 Then
                       ZMonat = 2
                ElseIf FMonat = 12 Then
                       ZMonat = 3
                End If
                
                    Case 7
                    If FMonat = 7 Then
                       ZMonat = 4
                    ElseIf FMonat = 8 Then
                           ZMonat = 5
                    ElseIf FMonat = 9 Then
                           ZMonat = 6
                    ElseIf FMonat = 10 Then
                           ZMonat = 4
                    ElseIf FMonat = 11 Then
                           ZMonat = 5
                    ElseIf FMonat = 12 Then
                           ZMonat = 6
                    End If
                    
                        Case 8
                        If FMonat = 8 Then
                           FMonat = 5
                        ElseIf FMonat = 9 Then
                               ZMonat = 6
                        ElseIf FMonat = 10 Then
                               ZMonat = 4
                        ElseIf FMonat = 11 Then
                               ZMonat = 5
                        ElseIf FMonat = 12 Then
                               ZMonat = 6
                        End If
                        
                            Case 9
                            If FMonat = 9 Then
                               ZMonat = 6
                            ElseIf FMonat = 10 Then
                                   ZMonat = 7
                            ElseIf FMonat = 11 Then
                                   ZMonat = 8
                            ElseIf FMonat = 12 Then
                                   ZMonat = 6
                            End If
                            
                                Case 10
                                If FMonat = 10 Then
                                   ZMonat = 7
                                ElseIf FMonat = 11 Then
                                       ZMonat = 8
                                ElseIf FMonat = 12 Then
                                       ZMonat = 9
                                End If
                                
                                    Case 11
                                    If FMonat = 11 Then
                                       ZMonat = 8
                                    ElseIf FMonat = 12 Then
                                           ZMonat = 9
                                    End If
                                    
                                        Case 12
                                        If FMonat = 12 Then
                                           ZMonat = 9
                                        End If
  
            End Select
            
   If ZMonat > 0 Then
      If FTag = 30 And _
      (ZMonat = 5 Or _
      ZMonat = 7 Or _
      ZMonat = 8 Or _
      ZMonat = 10 Or _
      ZMonat = 12) Then
      FTag = 31
        
      ZDatum1 = FTag & "." & ZMonat & "." & Year(Date)
      ZDatum = CDate(ZDatum1)

    ElseIf FTag = 31 And _
    (ZMonat = 4 Or _
    ZMonat = 6 Or _
    ZMonat = 9 Or _
    ZMonat = 11) Then
    FTag = 30
    
    ZDatum1 = FTag & "." & ZMonat & "." & Year(Date)
    ZDatum = CDate(ZDatum1)
    
    ElseIf ZMonat > 0 Then
      ZDatum1 = FTag & "." & ZMonat & "." & Year(Date)
      ZDatum = CDate(ZDatum1)
   End If
 End If
    
        'Forcast ermitteln
        
        Sheets("Rechnungen").Select
        
        For x = 2 To RLZeile
        
           Wert1 = Range("H" & x).Value
           Wert2 = Range("I" & x).Value
           Wert3 = Range("J" & x).Value
           Wert4 = Range("K" & x).Value
           Wert5 = Range("O" & x).Value
          
           ZKrit1 = Range("B" & x).Value
           ZKrit2 = Range("D" & x).Value
           ZKrit3 = Range("F" & x).Value
           ZKrit4 = Range("G" & x).Value
           ZKrit5 = Range("U" & x).Value
           ZKrit6 = Range("V" & x).Value
           ZKrit7 = Range("W" & x).Value
          
           VDatum1 = Range("M" & x).Value
           VDatum = CDate(VDatum1)
        
        If ZKrit1 = Krit1 And _
           ZKrit2 = Krit2 And _
           ZKrit3 = Krit3 And _
           ZKrit4 = Krit4 And _
           ZKrit5 = Krit5 And _
           ZKrit6 = Krit6 And _
           ZKrit7 = Krit7 And _
           VDatum = ZDatum Then
           Sheets("Forecast").Select
           Range("H" & i).Value = Wert1
           Range("I" & i).Value = Wert2
           Range("J" & i).Value = Wert3
           Range("K" & i).Value = Wert4
           Range("O" & i).Value = Wert5
           Exit For
        End If
        
        DoEvents
        
        Next x
  
End If

DoEvents

Next i

'Application.ScreenUpdating = True

MsgBox "Forecast abgeschlossen!"

End Sub

Ist durch Ausprobieren etwas länger geworden.
Aber ändert nichts.
 
Versuche mal eine Do-Schleife

Code:
i = 2
Do Until Sheets("Forecast").Cells(i,1) = ""

   j = 2
   Do Until Sheets("Rechnungen").Cells(j,1) = ""

   j = j + 1
   Loop

i = i + 1
Loop

Dann sparst du dir den anfälligen Mist mit Select; letzte Zeile usw.

Allgemein solltest du dein Code stark überdenken.
Man nutzt nicht so viele Variablen mit Wert1; Wert2, etc.
Da legt man ein passendes Array an und vergibt Wert(n).
 
Erst geht mir erstmal darum, dass ich eine funktionierende Lösung finde.
Wert1-5 hätte auch "Anzahl, Art, Lieferant, BudgetNr. und Kostenstelle" heißen können.

Hab gedacht, ich hätte jetzt auch eine Fehlerquelle gefunden.
Und zwar, dass, wenn keine Referenzrechnung gefunden wird, der Sprung in "Forecast" fehlt.
Also beende ich jetzt die 2. Schleife mit

Code:
Sheets("Forecast").Select
        
        DoEvents
        
        Next x

Funktioniert aber auch nicht so, wie ich will.

Der Fehler kann aber so groß nicht sein, da es ja für 10 Zeilen funktioniert.
Ergänzung ()

OK, jetzt hab ich es.

Habe nach der 2. Schleife ein

Code:
    If Sheets("Forecast").Activate = False Then
       Sheets("Forecast").Select
    End If

eingebaut.
Jetzt funktioniert es.

Manchmal hilft es ja schon, mit jemanden darüber zu sprechen.

Ich weiß, dass sich meine Programmierfähigkeiten im Rahmen halten
und ich nicht immer die beste Methodik wähle.
Aber bisher habe ich mit eurer Hilfe noch jedes Problem lösen können.

Vielen Dank für euren zuverlässigen Support.

VG,
Lasersword
 
Zuletzt bearbeitet:
Ich würde dir genau wie mac4life dazu raten nicht mit Select zu arbeiten. Das macht nur Probleme. Excel verhält sich dann als würde da jemand mit der Maus Rumklicken und wenn dann während das Macro läuft jemand klickt dann fliegt es einem um die Ohren.

Lass das Sheets("Rechnungen").Select weg und sprich die Range über die Arbeitsmappe und das Sheet an. Die Arbeitsmappe ist da auch wichtig weil einem sonst das makro um die Ohren fliegt wenn man eine andere geöffnete Exceldatei aufruft.

Beispiel:
Code:
For x = 2 To RLZeile

           Wert1 = Workbooks(ThisWorkbook.Name).Sheets("Rechnungen").Range("H" & x).Value
           Wert2 = Workbooks(ThisWorkbook.Name).Sheets("Rechnungen").Range("I" & x).Value
 
  • Gefällt mir
Reaktionen: mac4life
Zurück
Oben