• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Hulp bij for loop gevraagd

Status
Niet open voor verdere reacties.

MeltedForest

Gebruiker
Lid geworden
22 sep 2008
Berichten
178
Ik heb in mijn excel een knop staan met de volgende code erachter:

Code:
       Dim iButton As Integer
    Dim i As Long
        
    iButton = MsgBox("Weet u zeker dat u wilt archiveren?", vbOKCancel, "Archiveren")
    If iButton = vbCancel Then Exit Sub
        
    For i = 4 To Range("E65000").End(xlUp).Row
        
        If IsEmpty(Range("H" & i)) Then <volgende rij>
                    
        If IsDate(Range("H" & i).Value) = False Then
            iButton = MsgBox("U heeft geen datum ingevoerd! Regel: " & i " wordt niet gearchiveerd. Doorgaan met de rest?", vbYesNo, "Geen Datum!")
                If iButton = vbNo Then
                    Range("H" & i).Cells.Select
                    Exit Sub
                End If
        End If
        
        Range("H" & i).EntireRow.Copy Sheets("Maandoverzicht").Range("A" & Sheets("Maandoverzicht").Range("B65000").End(xlUp).Row + 1)
        Application.EnableEvents = False
        Range("H" & i).EntireRow.ClearContents
        Application.EnableEvents = True
        
    Next i

Ik krijg de melding Next Zonder For als ik invul:
Code:
If IsEmpty(Range("H" & i)) Then Next i
 
Laatst bewerkt:
Gewoon de test omdraaien:

Code:
        If NOT IsEmpty(Range("H" & i)) Then

Zou dat lukken

Cobbe
 
Maar als ik dat doe dan klopt het natuurlijk niet :D
Want hij moet kijken of hij leeg is, en als het veld leeg is naar de volgende gaan.
Ik heb het nu zo, maar ik krijg nog steeds Next zonder For melding als ik het probeer te draaien:

Edit: De Next zonder For melding komt bij de eerste Next.

Code:
    Dim iButton As Integer
    Dim i As Long
        
    iButton = MsgBox("Weet u zeker dat u wilt archiveren?", vbOKCancel, "Archiveren")
    If iButton = vbCancel Then Exit Sub
        
    For i = 4 To Range("E65000").End(xlUp).Row
        
        If IsEmpty(Range("H" & i)) Then
            Next i
        End If
        
        If IsDate(Range("H" & i).Value) = False Then
            iButton = MsgBox("U heeft geen geldige datum ingevoerd! Wilt u doorgaan? De volgende regel is niet gearchiveerd " & i, vbYesNo, "Geen geldige datum!")
                If iButton = vbNo Then
                    Range("H" & i).Cells.Select
                    Exit Sub
                End If
        End If
        
        Range("H" & i).EntireRow.Copy Sheets("Maandoverzicht").Range("A" & Sheets("Maandoverzicht").Range("B65000").End(xlUp).Row + 1)
        Application.EnableEvents = False
        Range("H" & i).EntireRow.ClearContents
        Application.EnableEvents = True
        
    Next i
 
Laatst bewerkt:
MeltedForest,

Ik heb er niet veel verstand van maar ik zie maar 1x For staan en 2x Next i.
Mijn simpele vorstel is haal er is een Next i uit en kijk wat er gebeurd.
 
Code:
Next i   -----> I = I + 1

Zo dan?

Cobbe
 
Code:
Next i   -----> I = I + 1

Zo dan?

Cobbe

Helaas werkt dat ook niet, want als ik i = i + 1 doe dan gaat hij wel verder in de lus, maar hij moet overnieuw beginnen met de lus, en dat doet de Next statement wel. De Next statement doet ook i automatisch één omhoog :)
 
Als je de eerste Next weg haald loopt de code wel door, heb ik net getest.
 
MeltedForest,

Als je de Next i onder End If zet en de onderste next i weghaald loopt de code ook door en beter dan in mijn vorige bericht, hij vraagt nu ook naar een datum.

Code:
For i = 4 To Range("E65000").End(xlUp).Row        
        If IsEmpty(Range("H" & i)) Then
            
        End If
        Next i
 
Code:
Sub archief()
  If  MsgBox("Weet u zeker dat u wilt archiveren?", vbOKCancel, "Archiveren")=vbOK then
    Application.EnableEvents = False        
    For i = 3 To cells(rows.count,5).End(xlUp).Row
      With [H1].offset(i) 
        If not IsEmpty(.value) and IsDate(.value) Then
          With .EntireRow
            .Copy Sheets("Maandoverzicht").cells(rows.count,2).End(xlUp).offset(,-1)
            .ClearContents
          End With
        End If
      End With
    Next
    Application.EnableEvents = True
  End If
End Sub
 
Laatst bewerkt:
Bedankt, die code werkt prima :)

Alleen nog één dingetje: als er geen datum in staat maar bijv. "abcd" als in het voorbeeld bestand, dan moet er nog een msgbox komen met de melding: "Rij <xx> niet gearchiveerd. Geen geldige datum."

Als ik het zelf erin probeer te doen krijg ik handenvol errors :p


Edit: of de celeigenschappen zo aanpassen dat er persé een datum gegeven moet worden, maar hoe doe ik dat? :s
 
Laatst bewerkt:
Als in kolom 3 alleen maar datums ingevoerd mogen worden:

Code:
Private sub workbook_change(Byval Target as range)
   if target.column=3 then target.interior.color=iif(isdate(target),vbwhite,vbred)
End sub
Ik vind meldingen gebruikersonvriendelijker dan signalen.

Als je de gebruikersinvoer echt goed wil begeleiden zul je gebruik moeten maken van userforms (vandaar de naam).
 
Kolommen E t/m H mogen alleen maar datums zijn :)
Ik heb idd nagedacht over userforms, maar dat vond ik uiteindelijk te omslachtig. Wellicht als alles goed loopt dat er daarna nog wat userform ingebakken worden :D

Bedankt iig :)

Edit: heb er wat mee getest en werkt perfect!

Bedankt snb voor je hulp :D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan