Excel vba rekenen met datum op formulier

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
Mijn vraag

Ik heb met Excel VBA een factureerprogramma gemaakt.
De input gebeurt via een formulier.
Voor de factureerdatum gebruikte ik de datumpicker van https://trevoreyre.com/portfolio/excel-datepicker/
Alles werkt, maar,
Ik gebruik naast de factureerdatum ook een vervaldatum.
Dus in het worksheet komt op B28 de Factureerdatum en op N28 de code
+B28 + 15
Nu blijkt dat als ik 1-12-2020 invoer de factureerdatum 12-1-2020 en de vervaldatum 27-1-2020 wordt.
Gevalletje Amerikaanse datumnotatie, dacht ik. Heb enorm zitten klooien met celeigenschappen en codes om de juiste notering te krijgen.
Maar niet hielp.
Nu blijkt dat als je, via de datumpicker 01-december-2020 invoert met de standaard celnotatie het getal 43842 (12-01-2020) krijgt en niet 44166 (01-12-2020).
Tja, dan kan je klooien tot je ons weegt, niets zal helpen.

Op een geven moment heb ik de datumpicker ertussen uitgehaald en moet de tekstbox handmatig worden ingevuld.
Met de code:
Private Sub txtFactuurdatum_Afterupdate()
txtFactuurdatum.value = Format(txtFactuurdatum.value, "dd-mm-yyyy")
If Not IsDate(txtFactuurdatum.Text) Then
MsgBox ("Voer een datum in")
txtFactuurdatum.Text = ""
End If
End Sub
ervoor gezorgd dat alleen een datum ingevoerd kan worden.
Als ik nu in het formulier 01-12-2020 invoer, krijg ik nog steeds de verkeerde berekening (27-1-2020) van de vervaldatum.
Hoe kan dit? en, belangrijker, wat kan ik eraan doen?
Als ik in het worksheet handmatig in cel B28 "01-12-2020" invoer, krijg ik wel normaal de juiste vervaldatum

Relevante software en hardware die ik gebruik
Microsoft 2019

Wat ik al gevonden of geprobeerd heb
Vooral bezig geweest met verschillende settings van celeigenschappen
Dus Nederlandse ("dd-mm-yy") en Amerikaanse ("mm-dd-yy") Datum settings proberen

Beste antwoord (via Bergenfietsen op 30-01-2021 14:23)


  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
code:
1
2
3
4
5
6
7
8
9
10
11
12
Sub DatumDing()
Dim Datum As String
Datum = Application.InputBox("Geef Datum!")

If IsDate(Datum) Then
    ActiveSheet.Cells(28, 2).Value = CDate(Datum)
    ActiveSheet.Cells(28, 14) = CDate(Datum) + 15
Else
    MsgBox "ja laat maar zitten"
End If

End Sub


werkt dit niet?

[ Voor 3% gewijzigd door DeDooieVent op 21-01-2021 15:21 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Om een tekst naar een datum om te zetten gebruikt Excel de locale systeem(regio)settings. dat kun je zien aan:
crtl+G (venster direct) ->
debug.print CDate("3-5-2020").

Afhankelijk van je systeeminstellingen komt daar 3 mei of 5 maart uit.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
Ik zou inderdaad een Cdate(datumwaarde) doen

bijvoorbeeld

Activesheet.cells(2,28)= Cdate(txtfactuurdatum)

[ Voor 43% gewijzigd door DeDooieVent op 21-01-2021 13:48 ]


Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
Bedoelen jullie mijn systeeminstellingen?
Die zijn "gewoon" Nederlands (korte datumnotatie is 21-1-2021)
DeDooieVent schreef op donderdag 21 januari 2021 @ 13:46:
Ik zou inderdaad een Cdate(datumwaarde) doen

bijvoorbeeld

Activesheet.cells(2,28)= Cdate(txtfactuurdatum)
Met deze instellingen krijg ik ook de verkeerde factuurdatum
Lustucru schreef op donderdag 21 januari 2021 @ 13:43:
Om een tekst naar een datum om te zetten gebruikt Excel de locale systeem(regio)settings. dat kun je zien aan:
crtl+G (venster direct) ->
debug.print CDate("3-5-2020").

Afhankelijk van je systeeminstellingen komt daar 3 mei of 5 maart uit.
Was even zoeken naar venster direct maar gevonden.
als ik "3-5-2020"invoer dan zie ik als antwoord 3-5-2020 staan
Dus ik kan nog steeds niet zien of het mei of maart is

[ Voor 89% gewijzigd door Bergenfietsen op 21-01-2021 14:25 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
code:
1
2
3
4
5
6
7
8
9
10
11
12
Sub DatumDing()
Dim Datum As String
Datum = Application.InputBox("Geef Datum!")

If IsDate(Datum) Then
    ActiveSheet.Cells(28, 2).Value = CDate(Datum)
    ActiveSheet.Cells(28, 14) = CDate(Datum) + 15
Else
    MsgBox "ja laat maar zitten"
End If

End Sub


werkt dit niet?

[ Voor 3% gewijzigd door DeDooieVent op 21-01-2021 15:21 ]


Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
In een proef bestand werkt het!
Nu nog implanteren in het echte bestand

Acties:
  • 0 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
Ja weet je, ik doe het dus met cells verwijzingen, dat lijkt raar, het is een (Rij, kolom) verwijzing, je kan gewoon tellen.

dat is leuk want dan kun je er dus variabelen in gooien, bijvoorbeeld

For i = 1 to 100

activeworkbook.activesheet.cells(i,1)= i

next

Je vult nu een kolom (a, of 1) met de waarde van i

Je kan ook nog een j maken voor de kolom.

Je kan zo ook elke cel langsgaam en iets mee doen, of iets zoeken. Dat gaat lang zo snel niet als zoek functies van excel zelf, maar ze zijn wel heel multifunctioneel.

Ook doe ik steeds active workbook en actvesheet, dat is niet handig

je kan dan nog beter thisworkbook gebruiken, en de sheet benoemen, dan heb je wat zekerheid wat waar gebeurt.

Ik zou zelf ook een form maken waar je dus die velden in aanmaakt, datum, maar ook die 15 dagen, desnoods vooraf ingeoerd (Dus value is 15 bij initialiseren)

Acties:
  • +1 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
[quote]
Dim datum as string
'Datum instellen
Datum = txtFactuurdatum
If IsDate(Datum) Then
Worksheets("Factuur").Cells(28, 2).value = CDate(Datum)
Worksheets("Factuur").Cells(28, 14) = CDate(Datum) + 15
Else
MsgBox ("Voer een datum in") '
txtFactuurdatum.Text = ""
/quote]

Bij het proefbestand werkt het goed
en nu weer niet.

[ Voor 13% gewijzigd door Bergenfietsen op 21-01-2021 16:03 ]


Acties:
  • +1 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 11:28
Bergenfietsen schreef op donderdag 21 januari 2021 @ 13:31:
[...]
Met de code:

code:
1
2
3
4
5
6
7
Private Sub txtFactuurdatum_Afterupdate()
txtFactuurdatum.value = Format(txtFactuurdatum.value, "dd-mm-yyyy")
If Not IsDate(txtFactuurdatum.Text) Then
MsgBox ("Voer een datum in")
txtFactuurdatum.Text = ""
End If
End Sub


ervoor gezorgd dat alleen een datum ingevoerd kan worden.
Let goed op welk attribuut je gebruikt om de waarde op te halen.
.Text zoals in je codevoorbeeld geeft de waarde zoals weergegeven op het scherm. Dus als de cel smaller word gemaakt en Excel toont daarom ####, dan geeft .Text ook de waarde ####. En als je datum als "lange datum" is opgemaakt, geeft die dus de tekst "1 december 2020". En die waarde varieert dus afhankelijk van je lokale instellingen.

Beste is Value2 te gebruiken, die geeft ongeformatteerd de onderliggende waarde. .Value kan ook, maar past juist bij datums eventueel nog lokale opmaak toe

Zie ook https://www.codegrepper.c...ext+.formula+.formular1c1

Acties:
  • 0 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
Als het werkt, werkt het :D

Zo sta ik er in :D en als het heel lang duurt maar het werkt wel, dan ga ik koffie halen, vroeger voor de afdeling, nu zet ik het zelf

:D

Voordeel is wel, ik mag hier wel aan de dame die er rondloopt zitten... hihitjes :')

Acties:
  • 0 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
dixet schreef op donderdag 21 januari 2021 @ 16:02:
[...]

Let goed op welk attribuut je gebruikt om de waarde op te halen.
.Text zoals in je codevoorbeeld geeft de waarde zoals weergegeven op het scherm. Dus als de cel smaller word gemaakt en Excel toont daarom ####, dan geeft .Text ook de waarde ####. En als je datum als "lange datum" is opgemaakt, geeft die dus de tekst "1 december 2020". En die waarde varieert dus afhankelijk van je lokale instellingen.

Beste is Value2 te gebruiken, die geeft ongeformatteerd de onderliggende waarde. .Value kan ook, maar past juist bij datums eventueel nog lokale opmaak toe

Zie ook https://www.codegrepper.c...ext+.formula+.formular1c1
Dit is nieuw voor mij ik dank u :D

Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
FF een update
De onderstaande quote van @DeDooieVent werkt goed in een testopstelling.
Dim datum as string
'Datum instellen
Datum = txtFactuurdatum
If IsDate(Datum) Then
Worksheets("Factuur").Cells(28, 2).value = CDate(Datum)
Worksheets("Factuur").Cells(28, 14) = CDate(Datum) + 15
Else
MsgBox ("Voer een datum in") '
txtFactuurdatum.Text = ""
Ook met de datumpicker krijg ik in de testopstelling de juiste data te zien

Bij implementatie in mijn eigen code komt toch weer de datumomdraaiing tevoorschijn.
Dus: Als ik in het formulier 01-12-2020 aangeef, komt bij de factuur 12-01-2020 tevoorschijn.
Waarbij de vervaldatum 27-01-2020 wordt ipv 16-12-2020

Dus ergens in de opbouw (code) van het formulier gaat er, denk ik, iets fout.
Maar, behalve bovenstaande code, wordt er nergens meer met datums gewerkt.
Is er misschien een instelling die ik over het hoofd zie?

Als ik "1- dec-2020" invoer op het formulier, krijg ik wel de juiste datum op de factuur te zien.
Dus ik kan er wel mee werken, maar ik zoek liever naar de (juiste) methode om alleen met getallen te werken

Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
Ik ben eruit!

Met de code van @DeDooieVent wordt de datum meteen in de worksheet factuur gezet
Deze code staat onder het Private Sub UserForm_Activate()

Vroeger gebeurde dat onder de Button VoegToe
Onder Private Sub CmdVoegtoe_Click() stond nog de code:
'Factuur maken
Sheets("Factuur").Range("B28").value = Me.txtFactuurdatum.value
Dat botste om een of ander manier met elkaar

Acties:
  • 0 Henk 'm!

  • DeDooieVent
  • Registratie: April 2005
  • Laatst online: 08-04 13:31
Bergenfietsen schreef op zaterdag 30 januari 2021 @ 14:23:
Met de code van @DeDooieVent wordt de datum meteen in de worksheet factuur gezet
nee, in de actieve sheet, beter benoem je hem idd zoals je doet, mijn code is vragen om ellende, was meer een korte test :D

Acties:
  • 0 Henk 'm!

  • Bergenfietsen
  • Registratie: Februari 2008
  • Laatst online: 08:59
klopt wat je zegt
maar ik heb eerst voor jouw code, de code
Worksheets("Factuur").Activate
toegevoegd.
En dan werkt je code perfect
Pagina: 1