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

FormatDateTime returning format als string

Status
Niet open voor verdere reacties.

rkoebrugge

Gebruiker
Lid geworden
5 nov 2009
Berichten
7
Hallo,

Ik heb voor een hele reeks rapporten zelf een class gemaakt welke runtime draaitabellen aanmaakt. Hier kan ik PivotFields (cellen) voor aanmaken, waarbij ik o.a. een cel-format kan opgeven. Omdat ik het rapport voor verschillende landen beschikbaar wil maken, is het wel zo netjes om de gebruiker een datum te tonen in het voor hem/haar normale formaat. VB heeft hiervoor de FormatDateTime functie, waarbij je een eigen formaat op kan geven, maar ook kan je werken met vbLongDate of vbShortTime. vbLongDate (of een variant) geeft in combinatie met de FormatDateTime functie de datum weer in het gebruikers formaat.

Voorbeelden:
NL gebruiker: formatdatetime(now(),vbLongDate) => donderdag 5 november 2009
DU gebruiker: formatdatetime(now(),vbLongDate) => Donnerstag, 5. November 2009
NL gebruiker: formatdatetime(now(),vbShortDate) => 5-11-2009
DU gebruiker: formatdatetime(now(),vbShortDate) => 05.11.2009

Voor het laatste voorbeeld worden hier respectievelijk de formaten format("d-mm-yyyy") & format("dd.mm.yyyy") gebruikt.

Wat ik graag wil is een manier waarop ik dit format terug krijg, maar dan in combinatie met regionale instellingen.
Dus bijvoorbeeld:
NL gebruiker: FunctieX(vbLongDate) => "d-mm-yyyy"
DU gebruiker: FunctieX(vbLongDate) => "dd.mm.yyyy"

Ik heb hiervoor het Internet reeds voor afgezocht, maar kon hier weinig in vinden. Ik kom veelal de functie formatdatetime + vbLongDate/vbLongTime tegen, maar dit is eigenlijk een enum welke omgezet wordt. Ik heb het formaat nodig, omdat je voor een Cell verschillende formaten kan meegeven. Excel maakt er dan een Custom format (numberformat) van.
 
Laatst bewerkt:
Als ik je vraag goed begrijp en ik resultaten van mijn test goed interpreteer kun je wat je wil realieren met deze VBA-regel:
Range("D5").NumberFormat = "m/d/y"

Daarmee past Excel de datumweergave aan aan de landinstelllingen.
 
snb,

Dit had ik zelf ook al geprobeerd, echter bij mij wisselde Excel de dag/maand niet om. Je voorbeeld geeft een maand/dag (English US format) op, maar in NL/DU gebruiken we dag/maan. In DU wordt de "/" wel vertaald naar een ".", maar wordt maand/dag niet omgezet naar dag/maand.

Ik kan het fout doen hoor, maar ik kreeg deze output. Tevens heb je ook een functie NumberFormatLocal welke ook weer anders is. Ik ben er alleen nog niet achter hoe ik dit kan combineren.

Daarnaast verwacht FormatDateTime een enum als datetime-format. Wanneer ik een andere notitie wil (bijv: "ddd dd-mmm uu:ss"), dan moet ik eindeloos veel verschillende opties opgeven. Ik zit nu te kijken naar een functie die van een datetime-format (Englisch US als basis) de string omzet naar een regionale datetime-format string. Bestaat dit?
 
Resultaat bij mij:

Range("D5").NumberFormat="m/d/y" : 05-11-2009

Bij mij wordt de struktuur "m/d/y" blijkbaar automatisch naar de lokale instellingen vertaald.

Range("D5").NumberFormatLocal = "dd-mm-jjjj" : 05-11-2009

De verwerking van data/tijden is niet het meest doorzichtige onderdeel van Excel.
Het nadeel van numberformatlocal is dat je de lokale aanduidingen voor de elementen moet geven
dag: d
maand m
jaar j
in het engels d/m/y
in het duits t/m/j (?)
in het frans j/m/a (?)

Ik ben wel nieuwsgierig waarom ik met "m/d/y" wel de juiste uitkomst krijg en jij niet. Mijn vbshortdate staat ingesteld op dd-MM-jjjj met scheidingsteken -
 
Laatst bewerkt:
snb,

Wanneer ik in een cell met de waarde 05-11-2009 de volgende VB code (activecell.NumberFormat="m/d/y") uitvoer, dan krijg ik "11-5-09" als resultaat. Hij zet dus niet de maand/dag om naar dag/maand. Ik heb als region Dutch (Netherlands) ingesteld. Wel is de taal van mijn OS (Vista) engels. Zou dit een probleem kunnen zijn? Ik kan me dat haast niet voorstellen, waar zijn anders de regionsettings van Windows voor??

Mooiste (voor mij) zou nog steeds zijn dat er een functie is die een English US formatstring omzet naar een Regional formatstring (dus vraagt een dateformat, en geeft dit terug)..
 
rkoebrugge, Persoonlijk handel ik datums in VBA af met de functie DateValue. Hiermee zorg je ervoor dat je kan werken met het eenduidige datumgetal. Het omzetten naar de lokale schrijfwijze wordt dan geregeld door de cel opmaak van het land waarin de sheet wordt gebruikt.Onze datum 5-11-2009 wordt dan niet plotseling als 11 mei 2009 gezien!

Heb je iets aan dit idee?

Groet, Leo
 
Ginger,

Probleem wat ik heb is dat ik in een draaitabel de datum goed wil tonen. Deze draaitabel maak ik aan met een class, waar numberformat dus een datum weergave kan doen, maar ook een getal met decimalen/negatieve(rood) kan weergeven. Ik kan hier dus geen controle doen of de opgegeven string een datum is (dit mede omdat ik verschillende formats opgeef). Ik zou hierin een aanname kunnen doen, maar mooi is dit niet. Wanneer ik niet de controle in die class laat doen, maar gewoon altijd het goede numberformat meegeef, dan is de datum altijd in het regionale formaat.
Ik heb ook wel zitten denken om de controle in de class te doen, met bijvoorbeeld het eerste teken een teken waarbij ik weet dat de resterende string de datum is, maar ook dan kan ik de omzetting niet doen (maand/dag wordt bij mij niet omgezet naar dag/maand). Ik snap ook eigenlijk niet zo goed hoe het komt dat snb wel de omzetting krijgt van maand/dag naar dag/maand..
 
Is er anders een manier waarmee ik op kan halen wat de notering en opbouw is van de verschillende DateFormats in regionale opbouw? Ik zou dan zelf de functie kunnen bouwen.

Ik snap overigens nog steeds niet hoe het kan dat snb wel het goede formaat getoond krijgt en ik niet. Iemand een idee hoe dit verschil kan ontstaan??
 
Iemand nog een idee?

snb, misschien nog een idee hoe bij jou het allemaal in één keer goed gaat?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan