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

loop werkt niet correct

Status
Niet open voor verdere reacties.

zjaffar

Gebruiker
Lid geworden
22 dec 2008
Berichten
14
hallo

ik zoek een manier om in excel een lijst af te lopen.

het is een agenda, De bedoeling is om via een macro gegevens in te voeren. die dan in chronologische volgorde geordend worden.

als er al een reeks data staan, dan moet steek steek ik een rij tussen de twee data die het begrenzen. Dit doe ik via een loop in VBA die bepaald wanneer de data die ingevoerd wordt kleiner is dan een al ingevoerde datum. daarna wordt er een rij ingevoerd boven die datum.

maar overduidelijk werkt die niet, want telkesn opniewu voegt hij een rij in aan het begin van de lijst.

Ik heb ook al geprobeerd de loop in omgekeerde richting te doen gaan, van onderen beginnen dus, maar dan plaatst hij hem simpelweg op het einde van de lijst.

ik ben een beetje ten einde raad.

het excel bestand zit erbij in een bijlage.

alvast bedankt

zjef
 

Bijlagen

zjaffar,

Ik ben geen programeur.
Kijk of je dit bedoeld.
Zoek eens in de helpmij bestand daar staan zat voorbeelden over het wegschrijven van gegevens.
Je kan natuurlijk met sorteren de gegevens op volgorde zetten.
 

Bijlagen

Laatst bewerkt:
yo

het werkt nog steeds niet, ik weet niet juist wat je gedaan hebt ook, buiten 1 lijn code geschreven die ik niet begrijp :p

vertel eens over sorteren, misschien kan ik zo het probleem oplossen!!!

sorteren op data zou het dan moeten zijn. ik heb er net op dit forum over opgezocht maar ik vind niet drct iks die mij goed kan helpen
 
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.
 
zjaffar,

het werkt nog steeds niet
Bij mij wel, wat er mis is weet ik niet.
vertel eens over sorteren
Je weet wat de macro recorder doet.
Start met een macro opnemen, selecteer het hele gebied en klik in het menu op sorteren op het deel aangepast sorteren en kies dan het juiste veld.
Vaak moet je het even proberen om er achter te komen hoe het werkt.
De ongedaan functie werkt dan niet meer (je kunt dus niet naar een vorige stand terug)
 
man, FINCH

JE BENT MEN HELD :p

Ik zit hier al dagen te zoeken en jij lost dat hier in 1 keer op. dankuwel man

ik weet dat het niet efficent werkt, maar alles heeft zen gebruiksaanwijzingen en ik ben maar een gigantische noob op het vlak van vba
uhumhum


Ik had het ook al lang in men achterhoofd, maareueh, zoals je deed van die data, bestaat dat ook voor het uur?

en voor hetzelfde programma heb ik eigenlijk nog een 2e probleem:

http://www.helpmij.nl/forum/showthread.php?t=394347



en hoornvan, dankuwel voor de uitleg van sorteren, kan wel heel handig zijn!!
 

Bijlagen

Ik had het ook al lang in men achterhoofd, maareueh, zoals je deed van die data, bestaat dat ook voor het uur?


Blij dat ik kon helpen.
Om terug te komen op je vraag, ja dat bestaat ook en heet TimeSerial. Druk binnen je VBE omgeving maar eens op F1, wat de help oproept, en zoek dan naar Timeserial voor te zien hoe die functie werkt.
 
jupjup

je bent een goeie leermeester :thumb:

check mij gaan, tlijkt omslachtig, maar het werkt, wuhuw

DateInput = DateSerial(jaar, maand, dag) 'maak van jaar, maand en dag een datum
MyTime = TimeSerial(uur, minuten, 0)


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

n = n - 1

Do While MyTime - Worksheets("agenda").Cells(n, 2) < 0 And DateInput - Worksheets("agenda").Cells(n, 1) = 0
n = n - 1
Loop

n = n + 1
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan