Avaldised ja VBA sisefunktsioonid

Avaldiste struktuur ja liigid

Avaldis määrab, mis tehted (operatsioonid) ja millises järjekorras on vaja väärtuse leidmiseks täita. Üldjuhul koosneb avaldis

  • operandidest,
  • tehtesümbolitest ja
  • ümarsulgudest.

Erijuhul võib avaldis koosneda ainult ühest operandist.

Operandideks võivad olla

  • konstandid,
  • lihtmuutujad,
  • objektide omadused,
  • struktuurmuutujate elemendid ja
  • funktsiooniviidad.

Nimeta konstandi väärtus (arv, string jm) esitatakse otse avaldises. Nimega konstant deklareeritakse lausega Const ning avaldises kasutatakse selle nime.

Lihtmuutujad esitatakse nimede abil, struktuurmuutujate elementide esitus sõltub andmekogumiku liigist (massiiv, kirje jmt).

Objekti omadus esitatakse alati koos viitega objektile kujul:
  objekt.omadus
,
kus omadus näidatakse vastava nime abil: Value, Left, Top, Address jne. Vaikimisi võetav omadus võib puududa, näiteks omadus Value Range‑objektil.

Funktsiooniviide esitatakse kujul:
  nimi
(argument {, argument })   

kus nimi on VBA sisefunktsiooni või kasutajafunktsiooni nimi (Sin, Sqr, CDbl, Pos_Kesk, Kolm_Pind jmt). VBA funktsioonide nimed ei kuulu reserveeritud võtmesõnade hulka, kuid muuks otstarbeks neid kasutada ei ole mõistlik, sest see võib tekitada segadust. Funktsiooniviites esinevad argumendid näitavad funktsioonile edastatavaid väärtusi. Argumendid võivad olla esitatud avaldiste abil. Argumentide arv, tüüp ja esitusjärjekord sõltuvad konkreetsest funktsioonist.

Tehted jagunevad nelja rühma:

  • aritmeetikatehted    ^ ,  * , / , \ , Mod , + , - 
  • stringitehe    & või +
  • võrdlustehted   = , <> , < , <= , > , >= 
  • loogikatehted Not, And, Or

Üldjuhul võivad avaldises esineda tehted kõikidest liikidest. Avaldise väärtuse leidmisel arvestatakse tehete prioriteete liikide vahel ning aritmeetika- ja loogikatehete puhul ka liigi sees. Tehete liigid on siin toodud prioriteetide  kahanemise järjekorras. Aritmeetika- ja loogikatehete prioriteedid kahanevad vasakult paremale. Avaldises 
a + b > c And a + c > b And b + c > a
esinevad aritmeetika-, võrdlus‑ ja loogikatehted. Väärtuse leidmisel täidetakse kõigepealt aritmeetika-, siis võrdlus- ning lõpuks loogikatehted.
Tehete järjekorra muutmiseks võib kasutada ümarsulge. Sulgudes asuva avaldise väärtus leitakse eraldi. Ümarsulgudes esitatakse ka funktsiooniviidete argumendid.

Sõltuvalt andmete liigist ning kasutatavatest tehetest ja leitava väärtuse liigist võib avaldised jagada järgmistesse rühmadesse: arvavaldised, stringavaldised ja loogikaavaldised.

Arvavaldised ja matemaatikafunktsioonid

Arvavaldiste operandide väärtusteks on arvud ning neis kasutatakse aritmeetikatehteid ning funktsioone, mis tagastavad arvväärtusi. Aritmeetikatehted ja nende prioriteedid on järgmised.

Prioriteet
Tehtesümbol
 Selgitus
1 ^  Astendamine a^n
2 -  Unaarne miinus -a * -b + c
3 * ja /  Korrutamine ja jagamine a * b, a / b
4 \  Jagatise täisosa a \ b, 13 \ 5= 2
5 Mod  Jagatise jääk a Mod b, 13 Mod 5 = 3
6 + ja -  Liitmine ja lahutamine a + b, a - b

Tehete prioriteetide rakendamise näiteid
-3^2 * 5 + 18 / 2 * 3 = -9 * 5 + 9 * 3 = -45 + 27 = -18,  
(-3)^2 * 5 + 18 / (2 * 3) = 9 * 5 + 18 / 6= 48
4^3^2 = 64^2 = 4096   64^1/3 = 641/3 = 64/3               64^(1/3) = 4

Võrreldes Exceliga on VBAs suhteliselt väike arv matemaatikafunktsioone. Puuduvad näiteks sellised sageli kasutatavad funktsioonid nagu kümnendlogaritm, arkussiinus ja arkuskoosinus.

Matemaatikafunktsioonid
 Funktsioon  Selgitus
 Sqr(a)  Ruutjuur Sqr (b^2 - 4*a*c) = (b^2 - 4*a*c)^(1/2)
 Log(a)  Naturaallogaritm (ln a) Log (a) / Log (10) = log 10 a
 Exp(a)  e^a (e = 2,71828…) ( Exp (-x) + Exp (2 * x)) / 2 = (e -x + e 2x ) / 2
 Abs(a)  Absoluutväärtus Abs ((a-x)/(a+x))
 Sin(a), Cos(a),  Tan(a)  Argument radiaanides Sin (x) + Cos (2*x) + Tan (x^2) - Cos (2*x)^2 =
 sin x + cos 2x + tan x 2 - cos 2 2x
 Atn(a)  arctan radiaanides (- p /2<x< p /2). Atn (a/Sqr(1-a^2))=
 arcsin a 2* Atn (1) - Atn (a/Sqr(1-a^2)) = arccos a. 4* Atn (1) = pi
 Int(a)  Lähim täisarv, mis on väiksem kui a Int (4.9)=4, Int (-4.9)=-5
 Fix(a)  Arvu täisosa Fix (4.9) = 4 Fix (-4.9) = -4
 Sgn(a)  Arvu märk Sgn (5)=1, Sgn (0)=0 (a=0), Sgn (-5)= -1 (a<0)
 Rnd()  Juhuslik arv x: 0 <= x < 1. n= Int ((b-a+1)* Rnd ()+a) - täisarv  vahemikus a <= n <= b

       Teisendusfunktsioonid

 Funktsioon  Selgitus. a – arv- või tekstavaldis
 Asc(a)  Esimese märgi ASCII-kood. Asc(“Abi“) = 65, Asc(1) = 48
 CDbl(a)  Teisendus topelttäpsusega realarvuks. | a | < 10^307
 CInt(a)  Teisendus täisarvuks. -32768 ≤ a ≤ 32767. Ümardatakse
 CLng(a)  Teisendus pikaks täisarvuks. -2^31 ≤ a ≤ 2^31
 CSng(a)  Teisendus ühekordse täpsusega reaalarvuks. | a | < 10^37
 CStr(a)  Teisendus stringiks
 CVar(a)  Teisendus Variant tüüpi
 Val(a)  Teksti teisendus arvuks. Murdosa jäetakse ära
 Int(a)  Lähim täisarv, mis on väiksem kui a  Int(4.9) = 4, Int(-4.9) = -5
 Fix(a)  Arvu täisosa  Fix(4.9) = 4   Fix(-4.9) = -4
 Round(a [, mp])  Ümardab väärtuse mp numbrikohani murdosas
 Format(a, for)  Arvu teisendamine etteantud vormingusse. for – vorming.  Peamine variant “0.0{0}“. Võimaldab määrata murdosa pikkuse:  Format(45.67375, "0.000") = > 45.674

Stringaaldivsed ja funktsioonid

Stringavaldiste operandide väärtuseks on stringid, neis võib kasutada stringitehet ja stringifunktsioone.

Stringitehet  & nimetataks sidurdamiseks. See võimaldab ühendada stringe ja ka arve. Sidurdamisel käsitletakse arve stringidena. Sidurdustehte sümbolina võib kasutada ka märki "+", kuid see pole soovitav. Näiteid

"Peeter" & " " & "Kask" annab Peeter Kask,   
35.7 & " " & 2.5 annab 35.7 2.5
Kui S=5378.75, x1=2.538, x2=-1.34, siis
"Summa= " & S annab Summa= 5378.75,     
"x1= " & x1 & "  x2= " & x2  =>  x1= 2.538  x2= -1.34

Stringifunktsioonid (s - stringiavaldis) Näidetes S = Visual Basic
 Left(s, n)  Eraldab stringist n vasakpoolset märki.  Left(S,6) = Visual
 Right(s, n)  Eraldab n parempoolset märki.  Right(S, 5) = Basic
 Mid(s, m, n)          Eraldab n märki alates märgist mMid(S, 8, 3) = Bas
 Len(s)  Leiab stringi pikkuse  Len(S) = 12
 InStr([n,] s1, s2)  Leiab positsiooni, millest algab string s2 stringis s1. n näitab  otsingu algust, vaikimisi 1InStr(S, “a”) = 5
 UCase(s)  Muudab väiketähed suurtähtedeks. UCase(S)=VISUAL BASIC
 LCase(s)  Muudab suurtähed väiketähtedeks. LCase(S)=visual basic
 Space(n)  Moodustab n tühikust koosneva stringi.  Space(80)
 String(n, märk)  Moodustab stringi, mis sisalda n näidatud märki
 Ltrim(s), Rtrim(s),  Trim(s)  Eemaldavad tühikut vastavalt stringi algusest, lõpust ning  lõpust ja algusest   Trim(Inputbox("Sisestage nimi"))
 Chr(kood)  ASCII koodile vastav märk  Chr(65) = A
 Asc(s)  Esimesele märgile vastav ASCII kood  Asc("A") = 65
 Val(s)  Teisendab stringi arvuks. Murdosa jäetakse ära
 Str(s)  Teisendab arvu stringiks  Str(3.14159*r*r)
 Format(a, for)  Teisendab väärtuse etteantud formaadiga tekstiks  Format(34.36732,"0.00") => 34.37

Operatsioonideks stringidega kasutatakse ka mõningaid erilauseid:
  Mid(s1, m[, n]) = s2
Asendab stringis s1 n märki, alates positsioonist m, märkidega stringist s2. Kui n puudub, kasutatakse stringi s2 tervikuna.
  LSet s1 = s2
Salvestab stringi s2 stringi s1 algusesse (vasakule).
  RSet s1 = s2
Salvestab stringi s2 stringi s1 lõppu (paremale).

Võrdlused ja loogikaavaldised

Võrdlused on käsitletavad loogikaavaldiste erijuhtudena, nende kuju on järgmine:

avaldis1 tehtesümbol avaldis2

Tehtesümbolid on järgmised:  = , <> , < , <= , > , >=

Avaldised avaldis1 ja avaldis2 on arv- või stringavaldised. Ühes võrdluses esinevad avaldised peavad kuuluma samasse liiki. Võrdluses võib olla ainult üks tehtesümbol. Võrdluse tulemiks on alati tõeväärtus True (tõene) või False (väär). Võrdluste näiteid

x <= 0,  b*b - 4*a*c < 0,  x*x + y*y > r*r, Ucase(vastus) = "EI"

NB! Stringide võrdlemisel eristatakse suur- ja väiketähti!

Loogikaavaldise üldkuju on järgmine:

avaldis LTS avaldis { LTS avaldis}

Siin on avaldis võrdlus või loogikaavaldis ja LTS loogikatehte sümbol. Peamised loogikatehted on Or, And ja Not. Nende tähendused on
Or  - või. Tehte a Or b  väärtus on tõene (True), kui vähemalt ühe operandi väärtus on tõene, vastupidisel juhul on tulem väär (False).
And - ja. Tehte a And b tulem on tõene (True) ainult siis, kui mõlema operandi väärtused on tõesed, vastupidisel juhul on tehte tulem väär (False).
Not - mitte. Tehte Not a tulem on tõene (True) siis, kui a väärtus on väär (False) ja väär (False) vastupidisel juhul.

Loogikaavaldiste näiteid
x >= 2 And x <= 13,  x < 2 Or x >13,  
a+b > c And a+c > b And b+c > a
sugu = 1 Or UCase(sugu) = "N" Or Ucase(Trim(sugu)) = "NAINE"

 Mõned loogikafuktsioonid
 IsDate(a)  Tõene, kui argument (a) on kuupäev
 IsEmpty(a)  Tõene, kui argumendi väärtus on tühi
 IsMissing(param)  Tõene, kui parameeter puudub
 IsNumeric(a)  Tõene, kui avaldise väärtus on arv
 IsObject(a)  Tõene, kui argumendiks on objekt

Ajaavaldised ja ajafunktsioonid

Kuna ajaväärtused on salvestatud lihtsalt reaalarvudena: täisosa -  päeva järjenumber alates baasajast (01:01:1900), murdosa - kellaaeg keskööst päeva osades, saab nendega täita põhimõtteliselt suvalisi operatsioone, kuid praktilist tähendust omavad ainult mõned:

aeg2 - aeg1                      
kuupäev2 - kuupäev1       
kellaaeg2 - kellaaeg1     
kuupäev + arv   
kuupäev - arv              
jooksev aeg - algaeg 


NOW() - #01/01/2000#

Date()  - sünniaeg  
finaeg - startaeg
Date() + 100

Date() - 100
Timer() – algaeg

Ajaväärtus üldjuhul koosneb kahest osast: kuupäev ja kellaaeg. Kahe ajaväärtuse (näiteks vahe on arv, mille täisosa on päevade arv kahe ajaväärtuse vahel, murdosa kellaaeg päeva osades. Kahe kuupäeva vahe saadakse päevades.

  Mõned ajafuktsioonid
 Now()  Jooksev aeg arvutis kujul: pp.kk.aaaa hh:mm:ss
 Date()  Jooksev kuupäev kujul: pp.kk.aaaa
 Time()  Jooksev kellaaeg kujul hh:mm:ss
 Timer()  Keskööst möödunud aeg sekundites täpsusega 0,01 sek
 Year(aeg)  Aasta number ajaväärtuses
 Month(aeg)  Kuu number ajaväärtuses
 Day(aeg)  Kuu number ajaväärtuses
 Hour(aeg)  Tunnid ajaväärtuses
 Minute(aeg)  Minutid ajaväärtuses
 Second(aeg)  Sekundid ajaväärtuses
 DateSerial(a, k, p)  Teeb kuupäeva aasta (a), kuu (k) ja päeva (p) alusel
 TimeSerial(h, m, s)  Teeb kellaja tundide (h), minutite (m) ja sekundite (s) alusel