VBA: NextYear, NextMonth etc. telt verkeerd

Pagina: 1
Acties:

  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Hoi,

Ik had een object kalender op een formulier gezet.
VBA code eronder om een X aantal j/m/w/d bij te tellen of vanaf te halen.
Dmv van 4 invoervelden, jaar, maand, week, dag. For next lus ertussen om als 9 dagen bijgeteld moeten worden, doet hij 9 x nextday en idem voor de rest.

Nu komt het: ik telde bv 3dagen, 9weken, 7maanden en 2 jaar bij. Deed dat tot 2040 en deed vervolgens hezelfde maar dan achteruit.
Tot mijn verbazing kwam ik niet op dezelfde dag uit als ik waar vanaf ik vertrok, scheelde soms een dag soms een week soms 2 weken.
Dus nu zit ik met het probleem dat ik niet weet hoe betrouwbaar de kalenderobject/funcie is. Nu dus onbetrouwbaar en onbruikbaar.
Hoe kan dit? En vooral hoe los ik dit op?

het gaat om vba97, kalender 8.0

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 09:43

RayNbow

Kirika <3

Misschien komt het vanwege de maanden en de jaren? Een dag is gedefinieerd als 24 uur. Een week is gedefineerd als 7 dagen. Maar een maand? Een maand kan 28 tot 31 dagen zijn. Hetzelfde geldt voor een jaar. Een jaar kan 365 of 366 dagen zijn. :?

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Bedankt voor je reactie, ik heb zelf even hetzelfde idee gehad. Want toen ik (1x) alleen dagen gebruikte het wel goed ging.

Maar hij heeft een begin datum, dus je zou zeggen als hij hetzelfde pad neemt dat hij altijd goed uitkomt.
Als hij daar al niet mee kan omgaan, wat is dan het nut van de functie.....

Er zullen toch meer mensen zijn die steeds op de eerste van de maand willen uitkomen om daar een actie op te starten ipv steeds 28 of 30 of 31 bij een datum op te tellen, dan is een (werkende) NextMonth wel handig :)

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Ehm... In VB zou ik gewoon netjes de DateAdd gebruiken. Geen loopjes nodig etc..

My personal website


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:39

Janoz

Moderator Devschuur®

!litemod

Als je op deze manier wilt werken zul je voor het terug tellen precies de tegenovergestelde volgorde aan moeten houden. Anders neem je inderdaad 2 verschillende paden met twee verschillende uitkomsten.

Start datum 28-2-2003
verschil 5 dagen 1 maand 1 jaar

28-2-03 dag 5-3-03 maand 5-4-03 jaar 5-4-04
28-2-03 jaar 28-2-04 dag 4-3-03 maand 4-4-04
28-2-03 maand 28-3-03 jaar 28-3-04 dag 2-4-04

Zoals je ziet kom ik door het gebruik van 3 verschillende volgorders op drie verschillende data uit.

Gerbuik inderdaad DateAdd.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Aaha zo had ik het nog niet bekeken ga het maandag meteen proberen. bedankt allemaal.

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Helaas, dit was het toch ook niet, hij blijft dus nog even openstaan.

Heb zelf ook nog geprobeerd, laag te beginnen in beide gevallen dwz d/w/m/j maar dat was het ook niet.
Blijkbaar gaan alleen dagen tellen goed.

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Heb je een voorbeeld? Als je heen d/w/m/j gebruikt er terug j/m/w/d dan zal je toch op hetzelfde moeten uitkomen. Ben wel erg benieuwd wat je precies doet en wat dat oplevert.

I'm not a complete idiot - several parts are missing.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

"Dit was het ook niet" en "Hij blijft dus nog even openstaan" zijn geen zinnen die mij duidelijk maken wat je dan geprobeerd hebt en op welke manier dat fout ging? Leg ajb wat duidelijker en uigebreider uit hoe en wat, dan kunnen wij wat beter (proberen te) helpen.

My personal website


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Mijn Excuus, wist niet precies hoeveel code er prijs werd gesteld:
Ik kan moeilijk het hele formulier erin plakken :)
is dit genoeg?

Private Sub UserForm_Initialize()
objKalender.Today 'Zet de datum op vandaag
OptieWeergave
End Sub


---- hier wordt de foutafvanging geregeld bij geen invoer op de 4 invoervelden
Private Sub txtDag_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If txtDag = "" Then Exit Sub
If Not IsNumeric(txtDag) Then
MsgBox "Voer een getal geldig in", vbCritical, "Invoerfout"
Cancel = True
End If
End Sub

Private Sub txtWeek_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If txtWeek = "" Then Exit Sub
If Not IsNumeric(txtWeek) Then
MsgBox "Voer een getal geldig in", vbCritical, "Invoerfout"
Cancel = True
End If
End Sub

Private Sub txtMaand_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If txtMaand = "" Then Exit Sub
If Not IsNumeric(txtMaand) Then
MsgBox "Voer een getal geldig in", vbCritical, "Invoerfout"
Cancel = True
End If
End Sub

Private Sub txtJaar_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If txtJaar = "" Then Exit Sub
If Not IsNumeric(txtJaar) Then
MsgBox "Voer een getal geldig in", vbCritical, "Invoerfout"
Cancel = True
End If
End Sub


-- telt alle ingevoerde velden bij begindatum op
Private Sub cmdOptellen_Click()
Dim i As Long
If Val(txtJaar) > 0 Then
For i = 1 To Val(txtJaar)
objKalender.NextYear
Next
End If
If Val(txtMaand) > 0 Then
For i = 1 To Val(txtMaand)
objKalender.NextMonth
Next
End If
If Val(txtWeek) > 0 Then
For i = 1 To Val(txtWeek)
objKalender.NextWeek
Next
End If
If Val(txtDay) > 0 Then
For i = 1 To Val(txtDag)
objKalender.NextDay
Next
End If
OptieWeergave
End Sub


-- Trekt alle ingevoerde velden van begindatum af. Hier heb ik ook een keer eerst previousday, previousweek, etc gedaan ipv eerst previousyear, previousmonth, etc. Bleef fout gaan.

Private Sub cmdAftrekken_Click()
Dim i As Long
If Val(txtJaar) > 0 Then
For i = 1 To Val(txtJaar)
objKalender.PreviousYear
Next
End If
If Val(txtMaand) > 0 Then
For i = 1 To Val(txtMaand)
objKalender.PreviousMonth
Next
End If
If Val(txtWeek) > 0 Then
For i = 1 To Val(txtWeek)
objKalender.PreviousWeek
Next
End If
If Val(txtDag) > 0 Then
For i = 1 To Val(txtDag)
objKalender.PreviousDay
Next
End If
OptieWeergave
End Sub

[ Voor 24% gewijzigd door ErikRo op 19-05-2003 18:11 ]

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

OK, als ik zo naar je code kijk heb ik twee opmerkingen:

1. Ik zie nergens de DateAdd() terugkomen. Heb je het ook met de DateAdd() geprobeerd, of is dit het enige dat je geprobeerd hebt?

2. Je werkt niet in de omgekeerde volgorde. In een van de eerdere posts staat ook al dat, als je de volgorde ymwd gebruikt bij optellen, dat je dan dwmy moet gebruiken bij aftrekken. Exact hetzelfde, maar dan omgekeerd. Heb je dat ook al geprobeerd? Dat kan ik namelijk niet uit je uitleg halen.

Verder zou ik toch echt willen adviseren dat je kijkt naar de verschillende manieren om met data te werken. Mocht je er dan nog niet uitkomen, dan is het wellicht een manier om de data om te rekenen naar longs, net als datgene wat je erbij op wilt tellen/er van af wilt trekken. Hiermee rekenen en vervolgens terugrekenen naar een datum.

Mocht je hiermee nog niet verder komen, dan ga ik morgen proberen wat jij nu doet na te maken, maar dan dat het wel werkt ;)

PS Die laatste opmerking is geen vrijbrief om tot die tijd niks te doen ;)

My personal website


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Hoi OZ-Gump, de DateAdd() had ik nog niet geprobeerd, geloof echter wel dat die werkt en zal die methode ook voortaan toepassen. Maar voor ik daaraan begin wil ik eigenlijk eerst nog eens kijken of ik achter het raadsel van "de verdwenen dagen" kan komen ;)

Wat betreft die andere opmerking Als ik optel via volgorde YMWD dan moet aftrekken weer via DWMY, had ik ook al hoopvol geprobeerd (zie ook commentaar 2e stuk). Maar daar zat het hem ook al niet in. Tenminste of ik moet ergens overheen kijken.

[ Voor 17% gewijzigd door ErikRo op 19-05-2003 23:03 ]

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Hmmmmzz....
Kan ik me iets bij voorstellen. In geval van tijdsdruk is een alternatief wel leuk, maar eigenlijk wil je wel ewten waar het fout gaat ;)

Ik heb hier net ff geprobeerd in Access XP een formulier aan te maken en er een Calendar Control 8.0 op te zetten, maar dat gaat niet goed. Zodra ik dat probeer, gaat mijn Access door zijn knieen. Gebruik jij die control? Want als dat zo is, probeer ik het morgen op het werk een keer. Als je iets anders gebruikt, laat je het dan even weten?

My personal website


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Ja, dat is hem weliswaar op NT4 en Office97, kalendercontrol 8.0 (nl versie zo te zien).
Op een standaard formulier , misschien handig om te weten, ik gebruik wel een formulier in een word document en dus de vba code in Word97.
Dus geen Acces97.

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Goed, heb het op nog een paar systemen geprobeerd, maar een calendar control gebruiken in een een van de applicaties van Office XP is blijkbaar niet meer de bedoeling: op alle systemen lopen alle applicaies vast waarin ik de Calendar Control wil gebruiken. Ook als ik ze op een apart formulier zet...

Kan je wat dat betreft dus niet verder helpen.

My personal website


  • ErikRo
  • Registratie: Juni 2001
  • Laatst online: 04-08 15:18
Misschien hadden ze zelf ook ontdekt dat hij niet goed telde :)
Helaas..
In ieder geval bedankt voor de vele pogingen!!

"I don't have any solution but I certainly admire the problem." -- Ashleigh Brilliant

Pagina: 1