Kirjoittaja: Antti Laaksonen
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
Muuttuja on tietokoneen muistissa oleva varattu paikka, johon voi tallentaa erilaista tietoa. Muuttujalla on tyyppi, joka ilmaisee siihen tallennettavan tiedon laadun: käyttäjän nimi esimerkiksi tallennetaan merkkijonomuuttujaan ja laskutoimituksen tulos lukumuuttujaan. Jos ohjelmassa on paljon samankaltaisia muuttujia, niistä kannattaa yleensä tehdä taulukko. Yhdessä taulukossa voisi vaikkapa olla kaikkien Euroopan maiden nimet ja pääkaupungit. Tässä oppaassa käsitellään muuttujia, taulukoita ja omia muuttujatyyppejä.
Visual Basicin tavalliset muuttujatyypit ovat String
(merkkijono), Byte
, Integer
ja Long
(kokonaisluku), Single
ja Double
(liukuluku), Currency
(desimaaliluku), Boolean
(totuusarvo), Date
(päivämäärä) ja Object
(objekti). Lisäksi on olemassa muuttujatyyppi Variant
, joka voi edustaa mitä tahansa muuttujatyyppiä. Muuttujan tyyppi muuttuu silloin tilanteen mukaan.
Merkkijono eli String
($
) on joko muuttuvan tai määrätyn pituinen. Jos pituus määrätään, se kirjoitetaan muuttujatyypin perään tähtimerkin kanssa. Esimerkiksi String * 10
tarkoittaa kymmenen merkin pituista muuttujaa. Merkkijonot kirjoitetaan lainausmerkkien sisään, ja niiden yhdistäminen tapahtuu &
-merkin avulla. Jos merkkijonon osana on lainausmerkit, ne täytyy kirjoittaa kahteen kertaan. Esimerkkejä:
"esimerkki"
"yhdistetty " & "merkkijono"
"kokeilu ""lainausmerkkien"" käytöstä"
Kokonaislukuja ovat Byte
, Integer
(%
) ja Long
(&
). Byte
-muuttuja on yhden tavun kokoinen, ja siihen voi sijoittaa luvun väliltä 0 - 255
. Integer
-muuttuja on kahden tavun kokoinen, ja siihen mahtuu luku väliltä -32768 - 32767
. Long
-muuttujan koko taas on neljä tavua, ja arvoalue on välillä -2147483648 - 2147483647
. Lukujen yhteydessä voi käyttää merkintöjä +
, -
, *
, /
, \
(kokonaislukujakolasku), Mod
(jakojäännös) ja ^
(potenssi) sekä sulkeita. Lukuja voi myös yhdistää merkkijonoon &
-merkin avulla. Esimerkkejä:
208
1 + 2 + 3
3 * (7 + 2)
50 & "-vuotias"
Liukulukuja ovat Single
(!
) ja Double
(#
), ja niiden koot ovat vastaavasti neljä ja kahdeksan tavua. Single
-muuttujan pienin arvo on -3,4 * 1038 ja suurin arvo on 3,4 * 1038. Double
-muuttujan pienin arvo taas on -1,8 * 10308 ja suurin arvo 1,8 * 10308. Liukuluku voi sisältää kokonaisosan lisäksi desimaaleja, mutta pyöristysvirheiden vuoksi tuloksen viimeisiin desimaaleihin ei ole luottamista. Desimaalipilkun merkkinä on piste, ja liukulukuja voi yhdistellä samalla tavalla kuin kokonaislukujakin. Esimerkkejä:
1.5
3.14159
Desimaaliluvun tallennusmuoto on Currency
(@
), jonka koko on kahdeksan tavua. Currency
-muuttuja voi sisältää luvun, jonka kokonaisosan pituus on 15 merkkiä ja desimaaliosan pituus neljä merkkiä. Liukuluvuista poiketen desimaalilukujen kanssa ei tapahdu pyöristysvirheitä, koska ne on todellisuudessa tallennettu kokonaislukuina. Yhdistelykeinot ovat jälleen samat edellisten lukumuuttujatyyppien kanssa.
Totuusarvo eli Boolean
on joko True
(tosi) tai False
(epätosi). Boolean
-tyyppisellä muuttujalla on siis vain kaksi tilaa.
Lukumuuttujien lopputunnuksia (%
, &
, !
, #
, @
) tarvitaan silloin, kun muuttujan tyyppi täytyy tuoda esille laskutoimituksen keskellä. Esimerkiksi lasku 300 * 300
aiheuttaa virheen, koska tulos ei mahdu oletuksena olevaan Integer
-tyyppiin. Siksi pitää kirjoittaa 300& * 300&
, jolloin virhettä ei tule.
Ennen kuin muuttujaa voi käyttää ohjelmassa, se täytyy määritellä esimerkiksi Dim
-lauseella. Muuttujan nimessä voi olla kirjaimia ja numeroita, mutta sen kuitenkin täytyy alkaa kirjaimella. Isoilla ja pienillä kirjaimilla ei ole merkitystä muuttujan nimessä. Tässä on muutamia muuttujamäärittelyitä:
Dim nimi As String ' merkkijonomuuttuja Dim vuosi As Integer ' kokonaislukumuuttuja Dim korkeus As Single ' liukulukumuuttuja
Kaikki määrittelyt voisi myös yhtä hyvin kirjoittaa samalle riville:
Dim nimi As String, vuosi As Integer, korkeus As Single
Muuttujan arvo määrittelyn jälkeen on tyhjä tai nolla. Arvon muuttaminen käy näin:
nimi = "Antti" ' muuttujan arvoksi tulee merkkijono vuosi = 2004 ' muuttujan arvoksi tulee luku pituus = 5 * 3.2 ' muuttujan arvoksi tulee laskun tulos pituus = pituus + .5 ' muuttujan arvo lasketaan muuttujan perusteella
Muuttujan arvon voi sitten näyttää vaikka viesti-ikkunassa:
MsgBox "Nyt on vuosi " & vuosi
Seuraava rivi kannattaa kirjoittaa jokaisen kooditiedoston alkuun:
Option Explicit
Tämä tarkoittaa sitä, että muuttujat täytyy aina määritellä ennen niiden käyttöä. Tavallisesti nimittäin muuttujia pystyy käyttämään ilman määrittelyä, ja ne ovat automaattisesti Variant
- eli muuttuvan tyyppisiä. Näin ei kuitenkaan vaivattomuudesta huolimatta kannata tehdä. Silloin kääntäjältä jäävät näet huomaamatta muuttujien nimien kirjoitusvirheet, jotka saattavat aiheuttaa hankalasti löydettäviä virheitä. Variant
-tyyppinen muuttuja myös vie enemmän tilaa muistissa kuin yksikään toinen muuttuja.
Muuttujan näkyvyysalue tarkoittaa sitä ohjelman osaa, jossa muuttujan arvo on näkyvissä ja käytettävissä. Lomakkeella ja moduulissa olevassa koodissa on kaksi osaa: alussa olevat määrittelyt ja proseduurien sisällä oleva koodi. Proseduuri on yleisnimitys tapahtumille, aliohjelmille ja funktioille (kahdesta viimeisestä lisää opassarjan kuudennessa osassa). Seuraava koodi-ikkunasta otettu kuva selventää asiaa:
Proseduurin sisällä muuttuja määritellään komennolla Dim
, ja muuttujan arvo ei ole näkyvissä proseduurin ulkopuolella. Muuttujan voi myös määritellä komennolla Static
, jolloin sen arvo säilyy muuttumattomana, vaikka proseduurista välillä poistuttaisiinkin. Seuraavassa esimerkissä lomakkeella on Command1-nappi, jonka Click
-tapahtumassa on sisäinen laskuri. Napista painettaessa laskurin arvo kasvaa yhdellä ja tulos näkyy viesti-ikkunassa.
Private Sub Command1_Click() Static laskuri As Integer laskuri = laskuri + 1 MsgBox laskuri End Sub
Koodin alussa määrittely Private
tai Dim
tarkoittaa, että muuttujan arvo on näkyvissä vain kyseisen lomakkeen tai moduulin proseduureissa. Jos taas määrittely on Public
tai Global
, muuttujan arvo näkyy kaikissa ohjelmaan kuuluvissa lomakkeissa ja moduuleissa. Tällaisia muuttujia kutsutaan yleisiksi muuttujiksi. Moduulissa määriteltyyn yleiseen muuttujaan voi viitata kaikista ohjelman osista suoraan muuttujan nimellä, mutta lomakkeessa määritellyn muuttujan eteen täytyy kirjoittaa lomakkeen nimi ja piste. Seuraavassa esimerkissä Command1 muuttaa muuttujan arvoa ja Command2 näyttää sen.
Dim aika As String Private Sub Command1_Click() aika = Time End Sub Private Sub Command2_Click() MsgBox aika End Sub
Luvut voi tavallisen kymmenjärjestelmän lisäksi esittää 16-järjestelmässä, jolloin niiden eteen laitetaan &H
-tunnus. Esimerkiksi 16
ja &H10
tarkoittavat samaa lukua. Funktio Val
muuttaa merkkijonon luvuksi ja Str
vastaavasti luvun merkkijonoksi. Lisäksi funktio Int
muuttaa luvun kokonaisluvuksi. Kuitenkaan muutosfunktioita ei tavallisesti tarvitse käyttää, koska Visual Basic huolehtii muutoksista itse. Seuraavassa esimerkissä viesti-ikkunassa näkyy luvun kokonaisosa.
Dim luku As Single luku = 12.45 MsgBox Int(luku)
Luvun muuttaminen kokonaisluvuksi niin, että pyöristys menee oikein, tapahtuu Round
-funktiolla. Funktion toisena parametrina voi olla desimaalien määrä. Esimerkiksi Round(15.7) = 16
ja Round(1.2345, 2) = 1.23
.
Esimerkiksi euron ja markan suhde on muuttumaton luku, joka voidaan esittää muuttujan lisäksi myös vakion avulla. Vakion määrittely kirjoitetaan koodin alkuun Const
-lauseella, ja siihen voi liittyä yleisen muuttujan tavoin näkyvyysalueen rajaus Private
- tai Public
-alkumäärityksellä.
Private Const EUROKERROIN = 5.94573
Nyt koodissa voidaan varsinaisen lukuarvon sijaan kirjoittaa vakion nimi.
Dim markat As Currency, eurot As Currency markat = 30 eurot = markat / EUROKERROIN
Vakioiden käytön etuna on se, että koodi näyttää selvemmältä. Ja jos vakion arvo myöhemmin vaihtuu, muutos täytyy tehdä vain vakion määrittelyyn. Muuttujaan verrattuna vakio ei kuluta ylimääräistä tilaa muistissa, koska arvot muutetaan lopullisiksi jo ohjelman käännösvaiheessa.
Jos ohjelman täytyisi käsitellä vaikkapa kymmenen henkilön nimiä, yksi tapa olisi tallentaa nimet erillisiin merkkijonomuuttujiin. Muuttujien määrittely näyttäisi silloin seuraavalta:
Dim nimi1 As String, nimi2 As String, nimi3 As String, nimi4 As String, nimi5 As String Dim nimi6 As String, nimi7 As String, nimi8 As String, nimi9 As String, nimi10 As String
Näin monen muuttujan käsittely on kuitenkin ongelmallista. Paljon parempi tapa onkin määritellä yksi taulukko, johon mahtuvat kaikki kymmenen muuttujaa. Taulukon määrittely muistuttaa tavallisen muuttujan määrittelyä, mutta taulukon nimen jälkeen sulkujen sisään tulee tieto siinä olevien muuttujien eli alkioiden määrästä.
Dim nimet(1 To 10) As String
Nyt taulukon alkioihin voi viitata seuraavalla tavalla:
nimet(1) = "Risto" MsgBox nimet(1)
Jos taulukon alkioiden määrän alarajaa ei ilmoiteta, se on oletuksena nolla. Taulukossa voi myös olla useampia ulottuvuuksia, jotka erotetaan sulkujen sisällä pilkuilla. Äsken määritelty nimitaulukko oli yksiulotteinen, ristinollan ruudukon sisältävä taulukko taas olisi kaksiulotteinen. Taulukossa voi olla useita kymmeniä ulottuvuuksia, mutta yleensä tarvitaan korkeintaan kolmea ulottuvuutta. Esimerkkejä erilaisista taulukoista:
' sisältää alkiot 0 - 8 Dim tiedot(8) As String ' sisältää alkiot 1995 - 2005 Dim vuodet(1995 To 2005) As Long ' sisältää yhteensä 100 alkiota Dim ruudukko(1 To 10, 1 To 10) As Integer
Ulottuvuuksia voi ajatella myös niin, että jokaista ensimmäisen tason alkiota kohden on tietty määrä toisen tason alkioita, joita kohden taas on tietty määrä kolmannen tason alkioita jne. Tämän vuoksi taulukon alkioiden määrä kasvaa nopeasti, kun ulottuvuuksia tulee lisää. Esimerkiksi taulukossa, jonka määritelty koko on (1 To 5, 1 To 8, 1 To 7)
, on yhteensä 5 * 8 * 7 = 280
alkiota.
Toisinaan ei etukäteen tiedetä, kuinka monta alkiota taulukossa täytyy olla. Silloin taulukko määritellään ilmoittamatta sen kokoa. Myöhemmin, kun tarvittava alkioiden määrä on tiedossa, taulukon kokoa voidaan muuttaa ReDim
-komennolla. Seuraavassa esimerkissä taulukon alkioiden määrä päätetään maara
-muuttujan perusteella. Tavallisessa taulukon määrittelyssä ei olisi mahdollista käyttää muuttujaa.
Dim kaupungit() As String maara = 5 ReDim kaupungit(maara) As String kaupungit(3) = "Helsinki"
Lomakkeella olevia ohjaimia voi myös järjestää taulukoihin. Yhdessä taulukossa voi kuitenkin olla vain samanlaisia ohjaimia. Kaikkien taulukkoon kuuluvien ohjainten nimi on sama, mutta Index
-arvot poikkeavat toisistaan. Näin määritetään nollasta alkavat ohjainten järjestysnumerot eli indeksit taulukossa. Jos ohjaimet ovat valmiiksi lomakkeella, muutetaan kunkin nimi samaksi, jolloin indeksit järjestyvät automaattisesti. Jos taas ohjaimia ei vielä ole, riittää, että samaa ohjainta kopioidaan lomakkeelle tarvittava määrä. Molemmissa tapauksissa pitää vastata myöntävästi kysymykseen Do you want to create a control array?.
Taulukossa oleviin ohjaimiin viitataan samalla tavalla kuin tavallisen taulukon alkioihin:
Command1(0).Caption = "Paina!"
Saman taulukon ohjaimilla on yhteinen tapahtumakäsittely. Uuden Index
-muuttujan avulla selviää, mikä taulukon ohjain on kulloinkin kyseessä.
Private Sub Command1_Click(Index As Integer) MsgBox "Painoit napista " & Index End Sub
Lisäksi on mahdollista luoda kokonaan uusia ohjaimia, kunhan lomakkeella on valmiiksi ainakin yksi ohjain, jonka Index
-arvo on määritelty. Uusi ohjain luodaan Load
-komennolla. Tämän jälkeen muutetaan yleensä ainakin ohjaimen paikkaa ja näkyvyyttä, koska uuden ohjaimen Visible
-ominaisuus on False
. Tässä esimerkissä lomakkeella on suunnitteluvaiheessa vain painonappi (Command1, jonka Index
on 0), mutta heti ohjelman alussa lomakkeelle ilmestyy toinen samanlainen nappi.
' luodaan uusi nappi Load Command1(1) ' määritetään napin paikka Command1(1).Move 1000, 1000 ' muutetaan nappi näkyväksi Command1(1).Visible = True
Muuttujatyyppejä voi tehdä myös itse. Oma muuttujatyyppi muodostuu Visual Basicin valmiista muuttujatyypeistä sekä mahdollisesti myös toisista omista muuttujatyypeistä. Muuttujatyypin määrittely kirjoitetaan koodin alkuun, ja sen yhteydessä voi käyttää samalla tavalla Private
- ja Public
-avainsanoja kuin muuttujien määrittelyssä. Seuraavassa määritellään oma tKirja-tyyppi, joka sisältää kirjan nimen, tekijän, painovuoden ja ISBN-numeron.
Private Type tKirja nimi As String tekija As String vuosi As Integer isbn As String End Type
Tämän jälkeen koodissa voi määritellä tKirja-tyyppisen muuttujan ja tallentaa siihen kirjan tiedot. Tiedon erotusmerkkinä on piste.
Dim kirja As tKirja kirja.nimi = "Sinuhe egyptiläinen" kirja.tekija = "Mika Waltari" kirja.vuosi = 1975 kirja.isbn = "951-643-580-7" MsgBox "Kirjan nimi on " & kirja.nimi
Jos peräjälkeen muutetaan saman muuttujan useita tietoja, voidaan käyttää With
-lausetta, jolloin muuttujan nimeä ei tarvitse kirjoittaa aina erikseen.
With kirja .nimi = "Sinuhe egyptiläinen" .tekija = "Mika Waltari" .vuosi = 1975 .isbn = "951-643-580-7" End With
Sama tekniikka toimii myös ohjainten kanssa.
With Command1 .Caption = "Paina!" .Move 1000, 1000 .Visible = True End With
VIRHE:
> pienempi kuin 8 > 5
Korjattu.
Entäs For silmukan Break?
omeletti
Mitä ihemettä...
<= pienempi tai yhtäsuuri kuin
>= pienempi tai yhtäsuuri kuin
eikös tuon alemman pitäisi olla suurempi tai yhtä suuri kuin...
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.