avalon1
Goto Top

EXCEL - VBA For-Schleifen Problem

Meine For-Schleife läuft trotz Überschreitung der Prüfwerte einfach weiter !?!

Hello

und zwar habe ich folgenden Code:


Private Sub Daten_bereinigen()

Workbooks("Auswertung.xls").Worksheets("LKW-Walter_taegl").Activate

Dim AktuelleZelle As Long

Dim LetzteZelle As Long
LetzteZelle = Cells(Rows.Count, 1).End(xlUp).Row


For AktuelleZelle = 2 To LetzteZelle

If Not IsNull(Workbooks("Auswertung.xls").Worksheets("LKW-Walter_taegl").Range("A" + Trim(Str(AktuelleZelle)))) Then
If IsEmpty(Workbooks("Auswertung.xls").Worksheets("LKW-Walter_taegl").Range("A" + Trim(Str(AktuelleZelle)))) Then
If AktuelleZelle < LetzteZelle Then
LetzteZelle = Cells(Rows.Count, 1).End(xlUp).Row
Rows(AktuelleZelle).Delete
AktuelleZelle = AktuelleZelle - 1
End If
End If
End If

Next AktuelleZelle

End Sub


Mein Problem ist dass die For-Schleife nicht aufhört zu laufen,
obwohl ich bei jedem Durchlauf die LetzteZelle verringere
und die Aktuelle Zelle erhöhe.

Ich hoffe Ihr könnt mir hier helfen!

LG

Content-ID: 145430

Url: https://administrator.de/contentid/145430

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 22.06.2010 um 18:44:05 Uhr
Goto Top
Hallo Avalon1!

Den Wert der Schleifenvariablen oder den Endwert einer "laufenden" "For-Next"-Schleife zu verändern ist eigentlich niemals eine gute Idee - andere Schleifentypen eignen sich in solchen Fällen besser.

Neben einigen Vereinfachungen (das Tabellenblatt wird ja ohnehin schon vorweg aktiviert und muss deshalb nicht nochmals angegeben werden, und anstelle der "Zusammenbastelei" der Adresse für "Range" bietet sich in solchen Fällen "Cells" an) würde ich auf eine "Do-While"-Schleife umstellen (die Variablennamen mit "Zelle" anstatt des eher entsprechenden "Zeile" habe ich beibehalten):
Private Sub Daten_bereinigen()

Workbooks("Auswertung.xls").Worksheets("LKW-Walter_taegl").Activate  

Dim AktuelleZelle As Long

Dim LetzteZelle As Long
LetzteZelle = Cells(Rows.Count, 1).End(xlUp).Row
AktuelleZelle = 2

Do While AktuelleZelle <= LetzteZelle
    If Not IsNull(Cells(AktuelleZelle, "A")) Then  
        If IsEmpty(Cells(AktuelleZelle, "A")) Then  
            Rows(AktuelleZelle).Delete
            LetzteZelle = LetzteZelle - 1
            AktuelleZelle = AktuelleZelle - 1
        End If
    End If
    AktuelleZelle = AktuelleZelle + 1
Loop
End Sub
Grüße
bastla

P.S.: Hinsichtlich der Notwendigkeit der "IsNull"-Prüfung habe ich leichte Zweifel ...
Avalon1
Avalon1 25.06.2010 um 21:21:23 Uhr
Goto Top
Super!!

Danke dir bastla

Habs hinbekommen mit deiner Hilfe!!

das mit der "IsNull" Prüfung war ziemlich unnötig !!


Hätt da noch ein kleines Problem
und zwar hab ich jetzt eine Eingabe von Jahr und Monat.
Jahr darf nur über 2010 sein und beim Monat muss zB: Jänner so geschrieben werden Jaenner
sonst findet die Methode die Datei nicht!
Mein Code schaut bis dato so aus:


Private Sub TestEingabe()

EingabeJahr = Application.InputBox("Bitte eine Jahreszahl eingeben" & vbCrLf & vbCrLf & "Auswertung erst ab Jaenner 2010 moeglich!.", "Eingabe des Jahres (ab 2010 !!)")
EingabeMonat = Application.InputBox("Bitte einen Monatsnamen eingeben." & vbCrLf & vbCrLf & "!! ACHTUNG !!" & vbCrLf & "Eingabe von ä nicht möglich!" & vbCrLf & "Bitte Eingabe von ae ", "Eingabe des Monat")

If EingabeJahr >= 2010 Then
Select Case EingabeMonat
Case "Jaenner" Or "Februar" Or "Maerz" Or "April" Or "Mai" Or "Juni" Or "Juli" Or "August" Or "September" Or "Oktober" Or "November" Or "Dezember"
Jahr = EingabeJahr
Monat = EingabeMonat
Case Else
MsgBox "Monat nicht korrekt eingegeben" & vbCrLf & "Auswertung wird geschlossen", vbOKOnly, Title:="Fehleingabe"
End Select
Else
MsgBox "Jahr muss 2010 oder höher sein" & vbCrLf & "Auswertung wird geschlossen", vbOKOnly, Title:="Fehleingabe"
End If

Debug.Print Jahr
Debug.Print Monat

End Sub


Mein Problem ist dass die MsgBox bei dem Select Case nicht kommt wenn man den Monat falsch eingibt !!!

Ausserdem wäre es schöner wenn nach einer Fehleingabe die Eingabe nochmals gestartet wird
und man so oft Eingeben muss bis man "richtige" Werte gibt .. ich weiß da gibts bei Java einen Trick
aber ist schon ein paar Jahre her als ich dass gemacht habe und ich find nix im Google....
vielleicht kannst du mir hierbei auch einen kleinen Tipp geben.....wär dir dankbar!!

LG
ava

PS: frage wie machst du das dein Code in einer "box" angezeigt wird?
bastla
bastla 25.06.2010 um 23:26:49 Uhr
Goto Top
Hallo Avalon1!

Ich würde als Eingabe des Monats einfach eine Zahl verlangen und dann daraus den Monatsnamen in der benötigten Form erzeugen - etwa so:
Sub Eingabe()
Do
    OK = True
    Abbruch = False
    EingabeJahr = InputBox("Bitte eine Jahreszahl eingeben" & vbCrLf & vbCrLf & "Auswertung erst ab Jaenner 2010 moeglich!.", "Eingabe des Jahres (ab 2010 !!)")  
    If IsNumeric(EingabeJahr) Then 'Zahl für Jahr eingegeben?  
        Jahr = CInt(EingabeJahr)
        If Jahr = 0 Then
            Abbruch = True
        Else 'Jahr nicht 0  
            If Jahr < 2010 Then
                OK = False
            Else 'Jahr mindestens 2010  

                Do 'Schleife Monatseingabe  
                    OKMon = True
                    EingabeMonat = InputBox("Bitte eine Monatszahl (1 - 12) eingeben." & vbCrLf & vbCrLf, "Eingabe des Monat")  
                    If IsNumeric(EingabeMonat) Then 'Zahl für Monat eingegeben?  
                        Mon = CInt(EingabeMonat)
                        If Mon = 0 Then
                            Abbruch = True
                        Else 'Monat nicht 0  
                            If Mon < 1 Or Mon > 12 Then
                                OKMon = False
                            Else 'Monat zwischen 1 und 12  
                                Monat = Replace(MonthName(Mon), "ä", "ae")  
                            End If
                        End If
                    Else 'keine Zahl für Monat eingegeben  
                        OKMon = False
                    End If
                Loop Until OKMon Or Abbruch
                
            End If
        End If
        Else 'keine Zahl für Jahr eingegeben  
            OK = False
    End If
    
Loop Until OK Or Abbruch
If Abbruch Then
    MsgBox "Na gut, dann nicht ..."  
Else
    MsgBox "Gewählt: " & Monat & " " & Jahr  
End If
End Su
... so oft Eingeben muss bis man "richtige" Werte gibt
Um nicht ganz so "brutal" zu sein: Bei Eingabe von "0" (für Jahr oder Monat) wird die Eingabeschleife abgebrochen (ein Hinweis in der "InputBox" wäre dann auch noch sinnvoll) ...

Das Ergebnis von "MonthName()" müsste eigentlich von der Ländereinstellung in der Systemsteuerung abhängig sein - kannst Du mit einer kleinen Schleife im Direktbereich kontrollieren:
For i = 1 To 12: ? MonthName(i): Next
Grüße
bastla

P.S.: Schön, dass Du nach der Formatierung als "" fragst ... face-smile