Minulle on parikin kertaa käynyt näin, että numeeriseksi tarkoitetun muuttujan arvo onkin tekstiä tms. Olen koodannut hyvin yksinkertaisia pätkiä Excelin VBscriptillä. Tässä tarkemmat tiedot
Esim.
dim a, b, c as double
a = txtLuku1.value '= 3
b = txtLuku2.value '= 5
c= a + b
msgbox c ' näyttää 35 eikä summaa 8
Tämä on toistunut joskus myös päiväysten kanssa, mutta muistaakseni silloin noilla Dim -jutuilla olen saanut homman toimimaan.
Huomaan tuon errorin esim. jos koodin loppuun tekee tahallaan virheen ja käy kurkkimassa, mikä arvo milläkin muuttujalla on. Tällöin VBscript editori ilmaisee väärässä muodossa olevan arvon lainausmerkkien sisällä esim. "3". Tällaisia arvoja se ei osaa laskea ainakaan + ja - merkeillä. Olen kiertänyt ongelman siten, että olen jakanut muuttujan 1:llä ja antanut sille näin uuden arvon. Tällöin ""-merkit poistuvat ja laskutoimitukset onnistuvat.
Missähän on vika, kun muuttujan tyypistä huolimatta VB käsittelee numeroita kirjaimina?
Dim-lauseessa jokaisen muuttujan tyyppi täytyy määrittää erikseen. Koodissasi oleva määritys tarkoittaa sitä, että a ja b ovat Variant-tyyppisiä muuttujia ja vain c on Double-tyyppinen. Kun Variant-tyyppiseen muuttujaan laitetaan merkkijono, se mukautuu String-tyyppiseksi. Ratkaisu on kirjoittaa muuttujamäärittelyt näin:
Dim a As Double, b As Double, c As Double
Tai vaihtoehtoisesti muuttaa merkkijonot Double-muotoisiksi sijoitusvaiheessa:
a = CDbl(txtLuku1.Value) b = CDbl(txtLuku2.Value)
Noin minäkin ajattelin, että jokainen muuttuja täytyy määrittää erikseen. ATK-ope ei osannut =p
Kiitoksia paljon vastauksesta, Antti!
Vielä kysyisin, mitä tuo "CDb1" tarkoittaa/mistä se tulee? Onko joku yleisnimitys tälle, jota käyttämällä voisin ohjeista etsiä vastaavat myös päiville, stringeille etc.?
CDbl tulee arvatenkin sanoista "convert to double". Tässä on kaikki VB:n muutosfunktiot:
muutettava tyyppi funktion nimi -------------------------------- Boolean CBool Byte CByte Currency CCur Date CDate Integer CInt Long CLng Single CSng String CStr
eikös toi CDbl() herjaa jos pistää esim. CDbl("")?
val() toimii paremmin
Aihe on jo aika vanha, joten et voi enää vastata siihen.