Kirjoittaja: neau33
Kirjoitettu: 13.12.2006 – 13.12.2006
Tagit: koodi näytille, vinkki
Eräs tapa tutkia laskennallisesti onko jokin päivämäärä kahden muun annetun päivämäärän väliltä.
Kun ensimmäisen muuttujan arvo on toisen muuttujan arvoa pienempi vähennetään
) 'Määritellään neljä muuttujaa Dim pvm1Val As Long, pvm2Val As Long, pvm3Val As Long, OnValilta As Boolean 'Määritellään kolme kolmen alkion taulukkoa ReDim Taulu1(0 To 2) As String, Taulu2(0 To 2) As String, Taulu3(0 To 2) As String 'Erotetaan kolmen esimmäisen tekstiruudun päivämääristä päivät, kuukaudet ja vuodet 'ja sijoitetaan niistä muodostuvat arvot taukukoihin Taulu1 = Split(DateValue(Format$(Text1.Text, "dd.mm.yyyy")), ".") Taulu2 = Split(DateValue(Format$(Text2.Text, "dd.mm.yyyy")), ".") Taulu3 = Split(DateValue(Format$(Text3.Text, "dd.mm.yyyy")), ".") 'Sijoitetaan muuttujiin kustakin taulukosta vuosien arvon kerrottuna 10000:lla, 'kuukausien arvon kerrottuna 100:lla ja päivien arvon muodostama summa pvm1Val = (Val(Taulu1(2)) * 10000) + (Val(Taulu1(1)) * 100) + (Val(Taulu1(0))) pvm2Val = (Val(Taulu2(2)) * 10000) + (Val(Taulu2(1)) * 100) + (Val(Taulu2(0))) pvm3Val = (Val(Taulu3(2)) * 10000) + (Val(Taulu3(1)) * 100) + (Val(Taulu3(0))) 'Ehdollistetaan ensimmäisen (pvm1Val) muuttujan arvo Select Case pvm1Val 'suhteessa toisen muuttujan (pvm2Val) arvoon. Case Is < pvm2Val '* '* Kun ensimmäisen muuttujan arvo on toisen muuttujan arvoa pienempi vähennetään 'esimmäisen muuttujan arvosta luku 1 ja toisen muuttujan arvoon lisätään luku 1. pvm1Val = pvm1Val - 1: pvm2Val = pvm2Val + 1 'Verrataan onko kolmannen muuttujan (pvm3Val) arvo suuermpi, kuin esimmäisen 'muuttujan arvo ja onko kolmannen muuttujan arvo pienempi, kuin toisen muuttujan arvo 'sekä sijoitetaan lausekkeen totuusarvo neljänteen (OnValilta) muuttujaan. OnValilta = (pvm3Val > pvm1Val And pvm3Val < pvm2Val) Case Is > pvm2Val '* '* Kun toisen muuttujan arvo on ensimmäisen muuttujan arvoa pienempi lisätään 'ensimmäisen muuttuja arvoon luku 1 ja toisen muuttujan arvosta vähennetään luku 1. pvm1Val = pvm1Val + 1: pvm2Val = pvm2Val - 1 'Verrataan onko kolmannen muuttujan (pvm3Val) arvo pienempi, kuin esimmäisen 'muuttujan arvo ja onko kolmannen muuttujan arvo suurmpi, kuin toisen muuttujan arvo 'sekä sijoitetaan lausekkeen totuusarvo neljänteen (OnValilta) muuttujaan. OnValilta = (pvm3Val < pvm1Val And pvm3Val > pvm2Val) Case Is = pvm2Val '* '* Kun esimmäisen ja toisen muuttujan arvot ovat samat verrataan onko kolmannen 'muuttujan arvo myös sama sekä sijoitetaan lausekkeen totuusarvo neljänteen '(OnValilta) muuttujaan. OnValilta = (pvm3Val = pvm1Val And pvm3Val = pvm2Val) End Select 'Päätetään ehtorakenne Text4.Text = OnValilta 'Sijotetaan muutujan arvo neljänteen tekstiruutuun Erase Taulu1, Taulu2, Taulu3 'Tuhotaan taulukot End Sub
Päivämääriä voi myös vertailla näin:
Dim pv1 As Date, pv2 As Date, pv3 As Date pv1 = "10.12.2006" pv2 = "16.12.2006" pv3 = "22.12.2006" If pv1 <= pv2 And pv2 <= pv3 Then MsgBox "Päivämäärä on välillä." End If If pv1 < pv2 And pv2 < pv3 Then MsgBox "Päivämäärä on aidosti välillä." End If
Lisää aikojen käsittelystä:
https://www.ohjelmointiputka.net/oppaat/opas.
https://www.ohjelmointiputka.net/hak/?kieli=Visual Basic&alue=Aika
Matemaattisesti/teknisesti katseltuna päivämäärät (Date) ovat Double-liukulukuja, joita vain käsitellään hieman eri sääntöjen mukaisesti erikoistilanteissa, kuten muutettaessa niiden sisältö merkkijonoksi.
Suosittelen myös käyttämään DateSerial-funktiota päivämääriä asettaessa, koska pakotetut muunnokset merkkijonosta päivämääräksi eivät välttämättä toimi kaikilla koneilla oletetulla tavalla: Windowsin alueelliset asetukset voivat vaikuttaa mm. päivämäärän ja kuukauden järjestyksen tulkitsemiseen.
Antti Laaksosen esityksessä on huomattava, että päivämäärät tallennetaan Date-tyyppiin. Vaikka vertailu näyttää merkkijonovertailulta, niin näin ei kuitenkaan ole. Varomaton päivämäärien vertailu merkkijonojen avulla kostautuu varmasti.