• 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.

Naar eerstvolgende datum gaan

Status
Niet open voor verdere reacties.

robdgr

Verenigingslid
Lid geworden
8 sep 2001
Berichten
4.430
Office versie
Microsoft 365
In deze vraag vond ik onderstaande code:
Code:
Sub naar_vandaag()
    With Sheets("Blad1")
        i = WorksheetFunction.Match(CLng(Date), .Rows(4), 0)
        Application.Goto .Cells(4, i), True
    End With
End Sub
Deze werkt goed als vandaag in de lijst staat, maar ik zoek een aanpassing dat hij dan naar de eerstvolgende datum springt op rij 4 als vandaag niet in de lijst staat. Ik wil de code toepassen in een bestand met twintig data per jaar, twee per maand en niet in de zomermaanden.

Ik heb allerlei variaties geprobeerd, maar krijg het niet werkend. Mijn kleine beetje VBA-kennis is ontoereikend.
 
Rob,

Hiermee moet het werken. Data moet wel aflopend gesorteerd zijn.
Code:
Sub naar_vandaag()
    With Sheets("Blad1")
        i = WorksheetFunction.Match(CLng(Date), .Rows(4), [COLOR="red"]-1[/COLOR])
        Application.Goto .Cells(4, i), True
    End With
End Sub
 
Gerard,

Dank en het werkt inderdaad onder die voorwaarde. Maar is er niet een oplossing die werkt bij een oplopende sortering, wat logischer is voor een jaarprogramma? Hij mag ook naar de dichtstbijzijnde datum ervoor gaan, dan ben ik in ieder geval in de buurt.
 
Laatst bewerkt:
rob, in dat geval kun je het beste gewoon door het bereik lopen, cell voor cell en stoppen wanneer de gegeven datum groter is als de gezochte datum.

Code:
Sub vandaag()

Dim rij As Long
Dim cell As Variant

For Each cell In Range("d1", Range("d65000").End(xlUp).Address)
    If CLng(Date) < cell.Value2 Then
        rij = cell.Row
        Exit For
    End If
Next cell

Application.Goto Cells(rij, 4), True

End Sub

*edit* oeps dit is kolom 4 even kijken

Code:
Sub vandaag()

Dim kolom As Long
Dim cell As Variant

For Each cell In Range("a4", Range("ca4").End(xlToRight).Address)
    If CLng(Date) < cell.Value2 Then
        kolom = cell.Column
        Exit For
    End If
Next cell

Application.Goto Cells(4, kolom), True

End Sub

voor rij
 
Laatst bewerkt:
Rob

Bij oplopende sortering het - weglaten
Code:
Sub naar_vandaag()
    With Sheets("Blad1")
        i = WorksheetFunction.Match(CLng(Date), .Rows(4), [COLOR="red"]-[/COLOR]1)
        Application.Goto .Cells(4, i), True
    End With
End Sub
 
@ Wampier,

Hartelijk dank, hij werkt perfect na aanpassing van het bereik:
Code:
Sub naar_vandaag()

Dim kolom As Long
Dim cell As Variant

For Each cell In Range("s4", Range("ao4").End(xlToRight).Address)
    If CLng(Date) < cell.Value2 Then
        kolom = cell.Column
        Exit For
    End If
Next cell

Application.Goto Cells(4, kolom), True

End Sub

@ gelens:
Gerard,

Ik had dat geprobeerd maar zonder resultaat, maar nu gaat hij inderdaad keurig naar de datum ervoor. Ook dank voor je aanvulling.
 
Laatst bewerkt:
Code:
For Each cell In Range("s4", [COLOR="red"]Range("ao4").End(xlToRight).[/COLOR]Address)
Rob, het rode gedeelte begrijp ik niet goed, wat is je bedoeling hiervan ?
Als het je bedoeling is om de laatst gevulde cel aan te duiden bedenk dan wel dat indien er een lege cel in dit bereik staat hij het adres van deze cel weergeeft zelfs indien er verderop nog gevulde cellen staan.
 
@Rudi,

Het gaat om een jaarprogramma met twintig activiteiten en ik wil zo naar de eerstvolgende activiteit na vandaag gaan, in dit geval 29 oktober, onze volgende excursie. Deze code doet dat. De code van Gerard gaat naar de laatste activiteit voor vandaag, dus 11 oktober, onze laatste avond. zaterdag 29 oktober staat daarnaast.

@Gerard,

Ik had jouw suggestie eerder geprobeerd op een aflopend gesorteerd bestand en dat werkt niet, nu wel.
 
@rob,

Ik denk wat Rudi bedoeld is: indien je in de code exact de range aangeeft waartussen de macro moet zoeken waarom dan nog de "end functie" gebruiken? en dat klopt wel. mijn originele code werkt in principe ongeacht het aantal cellen, tot het maximum(CA4 in mijn voorbeeld). indien je weet dat de lijst stopt bij AO4 en dat veranderd niet kun je ook:

For Each cell In Range("s4", "ao4")

gebruiken.
 
@wampier
Ik handhaaf toch je oorspronkelijke code, omdat het voorkomt dat ik een activiteit, buiten de oorspronkelijke planning om, aan de lijst toevoeg. In ieder geval dank voor de verduidelijking.
 
kijk net nog even naar de code

If CLng(Date) < cell.Value2 Then

moet eigenlijk

If CLng(Date) <= cell.Value2 Then

zijn, anders schiet je er ook voorbij als de huidige activitiet "vandaag" is.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan