Kirjautuminen

Haku

Tehtävät

Opasarkisto: Visual Basic -opas: Osa 3 - Muuttujat ja taulukot

  1. Osa 1 - Johdanto
  2. Osa 2 - Käyttöliittymä
  3. Osa 3 - Muuttujat ja taulukot
  4. Osa 4 - Ehdot ja silmukat
  5. Osa 5 - Aliohjelmat ja funktiot
  6. Osa 6 - Hiiri ja näppäimistö
  7. Osa 7 - VB:n grafiikkakomennot
  8. Osa 8 - Tiedostot
  9. Osa 9 - WinAPIn käyttö

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

Muuttujatyypit

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ä:

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ä:

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ä:

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.

Muuttujan määrittely

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

Määrittelypakko

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

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 ja merkkijonot

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.

Vakioiden käyttö

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.

Taulukko – useampia muuttujia yhdessä

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.

Muuttuvankokoinen taulukko

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"

Ohjaintaulukot

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

Oma muuttujatyyppi

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

Vähemmän kirjoittamista

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

Kommentit

Heikki [19.04.2003 22:47:51]

#

VIRHE:
> pienempi kuin 8 > 5

Antti Laaksonen [20.04.2003 01:45:15]

#

Korjattu.

ZcMander [29.01.2004 13:55:24]

#

Entäs For silmukan Break?

Silakka [11.02.2004 17:53:35]

#

omeletti

hotsonetti [27.04.2004 16:53:28]

#

Mitä ihemettä...

SirDayBat [08.06.2004 12:22:43]

#

<= pienempi tai yhtäsuuri kuin
>= pienempi tai yhtäsuuri kuin

eikös tuon alemman pitäisi olla suurempi tai yhtä suuri kuin...

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta