Kontrola datuma

Pomoč pri izdelavi makrov
Odgovori
dragopre
Prispevkov: 105
Pridružen: To Dec 11, 2012 11:46 pm

Kontrola datuma

Odgovor Napisal/-a dragopre »

Pri vnosu v tabelo podatke z VBA proceduro podatke vsebinsko kontroliram. Pred tem želim preveriti če so podatki formalno pravilni.
Zneske preverjam s funkcijo "Application.WorksheetFunction.IsNumber". ( VBA funkcija IsNumeric ne upošteva nastavitev formata vnosa).
Ne najdem pa rešitve za kontrolo datuma. Datum vnašam v obliki DD.MM.LLLL.
Funkcija IsDate mi pri vnosu DD,MM,LLLL vrne True.
Prosim za nasvet.

Hvala za pomoč
Lep pozdrav
Drago
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: Kontrola datuma

Odgovor Napisal/-a admin »

Pozdravljeni,

Pri ugotavljanju številk je stvar relativno preprosta, saj je vsakomur jasno, da če so med ciframi neustrezni znaki, potem to ni številka. Težava je edino z ločili za tisočice in desetice, vendar pa je to urejeno na nivoju Oken in ni problema.

Pri datumih pa je stvar malce bolj zanimiva. Datum lahko ljudje vpišemo na različne načine in z različnimi ločili. Datum lahko vpišemo celo z besedami, pa je to še vedno datum:

Koda: Izberi vse

? isdate("13 januar 2018")
True
VBA nima vgrajene funkcije, ki bi preverila ali je vpisan datum v ustreznem formatu, vendar pa je takšno funkcijo dokaj trivialno zapisati. Spodaj prilagam funkcijo, ki sem vam jo napisal in jo tudi komentiral.

Koda: Izberi vse

Function AliJeDatum(vnos As String, pricakovanFormat As String)
  ' predpostavim, da ni datum
  AliJeDatum = False

  ' če tudi VBA trdi, da ni datum, potem pač ni datum
  If (Not IsDate(vnos)) Then Exit Function
  
  ' če datum ni v pravilnem formatu potem ni ustrezno
  If (format(CDate(vnos), pricakovanFormat) <> vnos) Then Exit Function
  
  ' datum je v pravilnem formatu, zato ustreza
  AliJeDatum = True
End Function

Uporaba pa je seveda skrajno preprosta:

Koda: Izberi vse

? alijedatum("2019/07/13", "dd.mm.yyyy")
False

? alijedatum("13.07.2019", "dd.mm.yyyy")
True

? alijedatum("13.7.2019", "dd.mm.yyyy")
False
lp,
Matjaž Prtenjak
Administrator
Odgovori