Dcount met DateAdd, waar komen de " en/of de ' ?

Status
Niet open voor verdere reacties.

nillis

Gebruiker
Lid geworden
21 feb 2019
Berichten
14
Hallo allemaal,

Met de VBA opdracht Me.CrediteringTeLaat =DCount("*", "Q_Crediteringen", "Cr_DatumInvoer < #30-1-2021#") laat uitvoeren dan worden keurig alle records geteld die ouder zijn dan 2 maanden.
Maar wanneer ik het vetgedrukte vervang door Me.CrediteringTeLaat = DCount("*", "Q_Crediteringen", "Cr_DatumInvoer<" & "DateAdd("m", -2, Date)") dan geeft het de foutmelding: verwacht lijstscheidingsteken of ) .
En dan begint avontuur met het zoeken naar voorbeelden en verwijderen, toevoegen en verplaatsen van " en/of ' om er uiteindelijk helemaal gek :rolleyes: van te worden zonder het gewenste resultaat te krijgen. Doorgaans kom ik er door zoeken wel uit maar nu ben ik even de weg kwijt.

Is hiervoor ergens een syntax uitleg voor te vinden of gaat er iets in de basis fout?
 
dcount("*","Q_Crediteringen", "Cr_DatumInvoer>= #" & dateadd("m",-1,date) & "#" )

Het resultaat van de berekening dateadd moet berekend worden door de VBA instructie en dus buiten de aanhalingstekens en de resulterende datum moet tussen # tekens
 
D-functies zijn in essentie tekstfuncties; de output en input verwachten daarbij dus tekst als parameters. Daarom staan alle parameters dus tussen dubbele quootjes. Als je daar VBA Functies in wilt gebruiken, dan zijn die geen onderdeel van de D-functie, en die moet je dan ook buiten de strings houden. Vandaar dat je tweede functie niet werkt, want daar doe je dat niet. Je moet dan iets maken als:
Code:
DCount("1", "Q_Crediteringen", "Cr_DatumInvoer< Cdate(" & DateAdd("m", -2, Date) & ")")
Of:
Code:
DCount("1", "Q_Crediteringen", "Cr_DatumInvoer< #" & DateAdd("m", -2, Date) & "#")
Zonder voorbeeldje is het lastig testen; ik vermoed dat je de teil ingaat met deze constructies omdat je datum in VBA wordt gelezen als een Amerikaanse datum, terwijl je in de tabel waarschijnlijk Nederlands hebt staan. 9-7-2021 is dan uiteraard niet hetzelfde als 7-9-2021. Dat probleem heb je dan weer niet bij 30-3-2021. Dat wordt door beide notaties correct gelezen.
 
Fantastisch!
De vetgedrukte aanpassing dcount("*","Q_Crediteringen", "Cr_DatumInvoer>= #" & dateadd("m",-1,date) & "#" ) werkt feilloos.

Ook de uitleg door jullie beiden is helder en 'makes sense', deze heb ik tot nog toe nergens zo kunnen vinden.

Daarnaast valt het me, struinend door dit forum, telkens op dat de synergie tussen België en Nederland heerlijk om te lezen is.
NoellaG en OctaFish, dat jullie ons oplossingvragers nog vaak mogen bijstaan.

Dank.
 
Persoonlijk zou ik gaan voor deze constructie:
Code:
DCount("1", "Q_Crediteringen", "Cdbl(Cr_DatumInvoer])< Cdate(" & CDbl(DateAdd("m", -2, Date)) & ")")
Zoals ik al zei: je zit in je huidige code met het probleem dat 6-4 en 4-6 worden omgewisseld in je filter. Vermoedelijk merk je dat nog niet, anders had je niet gezegd dat de code feilloos werkt :). Deze variant is in ieder geval rostvast, en gaat nooit fout.
 
Uhm.... CDate en CDbl zijn toch VBA opdrachten voor Excel? Of maakt dat niet uit binnen Office?

En wat ik er van begrijp is dat daarmee de datum omgezet wordt in een getal en of het nu US of EU een gelijke uitkomst heeft?
 
Nee en Ja. Het zijn algemene functies. Maar dat geeft toch niet? Je mag, zeker als je een VBA functie gebruikt, zonder meer VBA opdrachten combineren. Je mag ze ook in queries gebruiken tenslotte, al is het altijd beter om de SQL variant te gebruiken als je die mogelijkheid hebt in een query. Maar dat is een andere vraag :).
CDate gebruik je om een getal om te zetten naar een datum en met CDbl zet je een datum (wat immers ook een getal is) weer om naar een getal. De truc is, dat een Nederlandse datum en een Amerikaanse datum dezelfde waarde hebben (uiteindelijk is het tenslotte dezelfde datum met slechts een andere weergave). Wat deze constructie doet, is de Amerikaanse datum omzetten naar een getal, en deze in de SQL functie DCount terugvertalen naar een Nederlandse datum. En dat gaat dus nooit fout. Bij mij is het in ieder geval een standaard techniek, als ik met datums werk.
 
Duidelijke uitleg, OctaFish.

Verder denkend meen ik dan dat de makers van Office en hun VBA er goed aan doen deze functies, zoals CDbl en CDate, bij het bewerken of berekenen van datums op de achtergrond laten meelopen zodat het verschil tussen US of EU datumformats geen problemen meer kunnen vormen. Maar nu gaan we verder dan de initiële vraag, die is beantwoord en daarmee is het probleem opgelost, waarvoor nogmaals dank.
:thumb:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan