Hallo zjaffar,
Een paar opmerkingen:
*Bij het vergelijken van datums kan je best de datums met elkaar vergelijken en niet de jaren, maanden en dagen apart. Daarom schrijf je best in de A kolom de datum weg ipv alleen het jaar. Je kan de datum bekomen door het jaardeel, het maanddeel en het dagdeel van je input samen te voegen via de DateSerial formule. Voorbeeldcode:
Code:
Dim DateInput As Date
DateInput = DateSerial(jaar, maand, dag) 'maak van jaar, maand en dag een datum
*Het meest efficiente is de datum bij te schrijven op de laatste regel en daarna te sorteren, zoals Hoornvan voorstelde. Wil je toch je zonder sorteren werken, kan je misschien onderstaande code gebruiken. (DateInput is de waarde van de eerste opmerking, en in kolom A staat een datum, dus niet alleen jaartal).
Code:
n = 2
Do Until DateInput - Worksheets("agenda").Cells(n, 1) < 0 Or Len(Worksheets("Agenda").Cells(n, 1)) = 0
'checken of de input datum > is dan datum in de sheet en kijken of je op het einde van de reeks gegevens zit
n = n + 1
Loop
Je moet dus niet alleen kijken of de datums tussen 2 datums inpast (via de conditie DateInput - Worksheets("agenda").Cells(n, 1) < 0), maar ook of je al aan het einde van de lijst met gegevens zit (via de conditie Len(Worksheets("Agenda").Cells(n, 1)) = 0)
*Vervolgens voeg je dan een rij in op basis van de n-waarde. Dat is goed, maar dan ga je nogmaals zoeken naar die lege rij. Dat is nergens voor nodig, je weet immers waar die zich bevindt. Op de n-de rij namelijk, dus je zoekactie met de i-variabele is nergens voor nodig.
*Je hebt de variabele n als integer gedefinieerd. Dat laat dus enkel input toe tot op rij 32.767, dat is immers de max waarde bij een integer. Beter is n als long te definiëren.
Dat geeft volgende voorbeeldcode, welke niet het meest efficiente is, maar wel doet wat je vraagt, en niet superveel afwijkt van je oorspronkelijke code:
Code:
Option Explicit
Sub probeersel()
Dim i As Integer, organisator As String, n As Long
Dim jaar As Integer, maand As Integer, dag As Integer, uur As String, activiteit As String
Dim soort As String, contactpersoon As String, inkom As Integer
Dim DateInput As Date
jaar = InputBox("welk is het jaar waarin de activiteit plaatsvind onder de vorm JJJJ")
maand = InputBox("geef de maand in welke de activiteit plaatsvind onder de vorm MM")
dag = InputBox("welke is de dag van die maand onder de vorm DD")
uur = InputBox("op welk uur is deze afspraak")
activiteit = InputBox("welke activiteit wilje plannen op deze datum?")
soort = InputBox("welk soort activiteit is dit?")
organisator = InputBox(" Wie is de organisator van deze activiteit?")
contactpersoon = InputBox("wie is de contactpersoon voor deze activiteit?")
inkom = InputBox("hoeveel zal deze activiteit kosten? (in euro) ")
'zoekt de datum die groter is dan degene die we willen invoegen'
DateInput = DateSerial(jaar, maand, dag) 'maak van jaar, maand en dag een datum
n = 2
Do Until DateInput - Worksheets("agenda").Cells(n, 1) < 0 Or Len(Worksheets("Agenda").Cells(n, 1)) = 0
'checken of de input datum > is dan datum in de sheet en kijken of je op het einde van de reeks gegevens zit
n = n + 1
Loop
'nu voegen we en rij in boven de grotere datum'
Worksheets("agenda").Rows(n).Insert
Worksheets("agenda").Cells(n, 1) = DateInput
Worksheets("agenda").Cells(n, 4) = uur
Worksheets("agenda").Cells(n, 5) = activiteit
Worksheets("agenda").Cells(n, 6) = soort
Worksheets("agenda").Cells(n, 7) = organisator
Worksheets("agenda").Cells(n, 8) = contactpersoon
Worksheets("agenda").Cells(n, 9) = inkom
End Sub
*Deze code blijft echter foutgevoelig. Je hebt nergens controle op je inputwaarde. Bijvoorbeeld een inputwaarde van 25 bij de maand, geeft een heel andere datum dan waarschijnlijk de bedoeling was. Daarom de raad om je input die makkelijk kan fout lopen te beperken bv. via een datecontrol voor de datum, comboboxen met enkel de mogelijke waarde, .. en/of de input waarde na invoer te controleren of ze binnen een toegestaan bereik passen, en/of voldoen aan de syntax die je verwacht van de invoer.