Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sisäänrakennettujen funktioiden käyttäminen | VBA Fundamentals
Excel VBA Liiketoiminnan Automaatioon

Sisäänrakennettujen funktioiden käyttäminen

Pyyhkäise näyttääksesi valikon

VBA sisältää useita satoja sisäänrakennettuja funktioita, joista suurinta osaa et koskaan käytä. Alla olevat funktiot ovat kuitenkin erittäin yleisiä liiketoiminnan automaatiossa — tekstin siistiminen, päivämäärien käsittely ja tietotyyppien muuntaminen.

Päivämääräfunktiot

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() ja Date näyttävät samankaltaisilta, mutta vastaavat eri kysymyksiin — Now() sisältää nykyisen ajan sekunnin tarkkuudella (hyödyllinen makron suoritusajan leimaamiseen), kun taas Date antaa vain kalenteripäivän, mikä on tarpeen esimerkiksi eräpäivien tai ikien laskennassa. DateAdd ja DateDiff ovat toistensa vastakohtia: DateAdd siirtää päivämäärää eteen- tai taaksepäin annetun yksikön verran ("d" tarkoittaa päiviä, mutta myös "m" kuukausille ja "yyyy" vuosille toimii), kun taas DateDiff mittaa kahden päivämäärän välisen eron.

Note
Huomio

VBA:n päivämääräliteraalit — kaikki, mikä kirjoitetaan #-merkkien väliin, kuten #01/09/2023# — käyttävät aina KK/PP/VVVV-järjestystä sisäisesti, riippumatta Windowsin alueasetuksista tai järjestelmän kielestä. Eli #01/09/2023# tarkoittaa 9. tammikuuta 2023, ei 1. syyskuuta, vaikka käyttäisit arjessa PP/KK/VVVV-muotoa. Tämä eroaa siitä, miten päivämäärät syötetään laskentataulukon soluun, jossa alueasetukset vaikuttavat — #...#-literaalimuoto on VBA:n oma sääntö, joka pysyy samana riippumatta siitä, missä koodi ajetaan.

Tekstifunktiot

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase ja LCase ovat hyödyllisiä, kun halutaan tehdä vertailu kirjainkoosta riippumatta, esimerkiksi If UCase(category) = UCase("electronics") Then toimii riippumatta siitä, miten kategoria on alun perin kirjoitettu. Left, Right ja Mid kaikki poimivat osan merkkijonosta, ero on vain siinä, mistä kohtaa laskenta aloitetaan: Left ja Right laskevat kahdesta päästä, kun taas Mid ottaa aloituskohdan ja pituuden, minkä vuoksi Mid("P001", 2, 3) ja Right("P001", 3) palauttavat tässä saman tuloksen — "P001" sisältää vain yhden etunumeron, joten "aloita kohdasta 2" ja "viimeiset 3 merkkiä" osuvat samaan alimerkkijonoon. Trim poistaa hiljaisesti alussa ja lopussa olevat välilyönnit — vaatimaton funktio, joka pelastaa usein, kun dataa on kopioitu jostain, missä välilyönnit ovat epäjohdonmukaisia. InStr etsii merkkijonon toisen sisältä ja palauttaa sijainnin, josta se löytyy (tai 0, jos sitä ei löydy lainkaan), eli näin voit testata "sisältääkö tuotenimi sanan Mouse?" ilman, että tarvitsee olla täsmällinen osuma.

Numeraaliset funktiot

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round ja Int molemmat pienentävät lukua, mutta eri tavoin — Round(24.996, 2) pyöristää lähimpään arvoon kahden desimaalin tarkkuudella (25.00, joka näkyy 25:nä), kun taas Int(7.9) katkaisee aina alaspäin kohti nollaa riippumatta siitä, kuinka lähellä desimaali on seuraavaa kokonaislukua, antaen tulokseksi 7 eikä 8. Näiden sekoittaminen on yleinen hinnoitteluvirheiden lähde: hinnan pyöristäminen lähimpään senttiin kannattaa lähes aina tehdä Round-funktiolla, ei Int-funktiolla, muuten alihinnoittelet järjestelmällisesti jokaisen tapahtuman murto-osalla senttiä.

Tietotyyppien muunnos

Kriittistä, kun arvoja haetaan laskentataulukosta, koska soluarvot tulevat usein Variant-tyyppisinä:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl muuntaa Double-tyyppiin, CInt Integer-tyyppiin, CStr muuntaa String-tyyppiin ja CDate muuntaa oikeaksi Date-arvoksi.

Miksi ei vain antaa VBA:n muuntaa automaattisesti tarvittaessa? Useimmiten se toimiikin, mutta siihen luottaminen on riskialtista: solu, joka näyttää numerolta mutta onkin kirjoitettu tai tuotu tekstinä, voi aiheuttaa If-vertailun tai laskutoimituksen epäonnistumisen tai odottamattoman tuloksen, ja eksplisiittinen muunnos paljastaa virheen heti sillä rivillä, jossa huono data on, eikä vasta myöhemmin koodin edetessä.

Tehtävä

  1. Kirjoita rivi, joka poimii pelkän numeerisen osan "P003":stä käyttäen Mid-funktiota (vihje: aloita kohdasta 2).
  2. Kirjoita rivi, joka muuntaa poimitun tekstin oikeaksi numeroksi käyttäen CInt tai CLng.
  3. Käytä DateDiff-funktiota laskeaksesi, kuinka monta päivää sitten Emma Davis palkattiin (15/03/2020) verrattuna tähän päivään.
Vihje
expand arrow

1. Numeerisen osan poimiminen

  • Mid tarvitsee kolme tietoa: itse merkkijonon, mistä kohdasta aloitetaan laskeminen ja kuinka monta merkkiä otetaan.
  • "P003" sisältää yhden kirjaimen ja kolme numeroa — haluat ohittaa "P":n ja ottaa kaiken sen jälkeen.
  • Aloituskohta 2 tarkoittaa "aloita toisesta merkistä" — laske "P003" sormillasi varmistaaksesi, että kohta 2 on ensimmäinen "0".

2. Muuntaminen oikeaksi numeroksi

  • Kaikki, mitä Mid palauttaa, on edelleen tekstiä, vaikka se näyttää numerolta.
  • Kääri koko Mid(...)-lauseke CInt(...) tai CLng(...) sisään — muunnat yhden funktion tuloksen toisella funktiolla.
  • Muistutus aiemmin luvusta: CInt/CLng muuntaa tekstin kokonaisluvuksi; käytä CLng, jos et ole varma, voiko luku olla suuri.

3. Päivien määrä palkkauspäivästä

  • DateDiff tarvitsee kolme asiaa: mittayksikön ("d" päiville), aloituspäivän ja lopetuspäivän.
  • Hankala osa on päivämäärän kirjoittaminen VBA:ssa — ympäröi se #-merkeillä, kuten #03/15/2020#. #...#-sisällä VBA odottaa kuukausi/päivä/vuosi -järjestystä, alueasetuksista riippumatta — joten 15. maaliskuuta on #03/15/2020#, ei #15/03/2020#.
  • "Tätä päivää" varten sinun ei tarvitse kirjoittaa päivämäärää lainkaan — on olemassa avainsana kohdasta 2.3, joka palauttaa aina nykyisen päivämäärän.
  • Laita nämä kaksi päivämäärää DateDiff-funktioon oikeassa järjestyksessä — aikaisempi ensin — muuten saat negatiivisen luvun.
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Sisäänrakennettujen funktioiden käyttäminen

VBA sisältää useita satoja sisäänrakennettuja funktioita, joista suurinta osaa et koskaan käytä. Alla olevat funktiot ovat kuitenkin erittäin yleisiä liiketoiminnan automaatiossa — tekstin siistiminen, päivämäärien käsittely ja tietotyyppien muuntaminen.

Päivämääräfunktiot

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() ja Date näyttävät samankaltaisilta, mutta vastaavat eri kysymyksiin — Now() sisältää nykyisen ajan sekunnin tarkkuudella (hyödyllinen makron suoritusajan leimaamiseen), kun taas Date antaa vain kalenteripäivän, mikä on tarpeen esimerkiksi eräpäivien tai ikien laskennassa. DateAdd ja DateDiff ovat toistensa vastakohtia: DateAdd siirtää päivämäärää eteen- tai taaksepäin annetun yksikön verran ("d" tarkoittaa päiviä, mutta myös "m" kuukausille ja "yyyy" vuosille toimii), kun taas DateDiff mittaa kahden päivämäärän välisen eron.

Note
Huomio

VBA:n päivämääräliteraalit — kaikki, mikä kirjoitetaan #-merkkien väliin, kuten #01/09/2023# — käyttävät aina KK/PP/VVVV-järjestystä sisäisesti, riippumatta Windowsin alueasetuksista tai järjestelmän kielestä. Eli #01/09/2023# tarkoittaa 9. tammikuuta 2023, ei 1. syyskuuta, vaikka käyttäisit arjessa PP/KK/VVVV-muotoa. Tämä eroaa siitä, miten päivämäärät syötetään laskentataulukon soluun, jossa alueasetukset vaikuttavat — #...#-literaalimuoto on VBA:n oma sääntö, joka pysyy samana riippumatta siitä, missä koodi ajetaan.

Tekstifunktiot

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase ja LCase ovat hyödyllisiä, kun halutaan tehdä vertailu kirjainkoosta riippumatta, esimerkiksi If UCase(category) = UCase("electronics") Then toimii riippumatta siitä, miten kategoria on alun perin kirjoitettu. Left, Right ja Mid kaikki poimivat osan merkkijonosta, ero on vain siinä, mistä kohtaa laskenta aloitetaan: Left ja Right laskevat kahdesta päästä, kun taas Mid ottaa aloituskohdan ja pituuden, minkä vuoksi Mid("P001", 2, 3) ja Right("P001", 3) palauttavat tässä saman tuloksen — "P001" sisältää vain yhden etunumeron, joten "aloita kohdasta 2" ja "viimeiset 3 merkkiä" osuvat samaan alimerkkijonoon. Trim poistaa hiljaisesti alussa ja lopussa olevat välilyönnit — vaatimaton funktio, joka pelastaa usein, kun dataa on kopioitu jostain, missä välilyönnit ovat epäjohdonmukaisia. InStr etsii merkkijonon toisen sisältä ja palauttaa sijainnin, josta se löytyy (tai 0, jos sitä ei löydy lainkaan), eli näin voit testata "sisältääkö tuotenimi sanan Mouse?" ilman, että tarvitsee olla täsmällinen osuma.

Numeraaliset funktiot

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round ja Int molemmat pienentävät lukua, mutta eri tavoin — Round(24.996, 2) pyöristää lähimpään arvoon kahden desimaalin tarkkuudella (25.00, joka näkyy 25:nä), kun taas Int(7.9) katkaisee aina alaspäin kohti nollaa riippumatta siitä, kuinka lähellä desimaali on seuraavaa kokonaislukua, antaen tulokseksi 7 eikä 8. Näiden sekoittaminen on yleinen hinnoitteluvirheiden lähde: hinnan pyöristäminen lähimpään senttiin kannattaa lähes aina tehdä Round-funktiolla, ei Int-funktiolla, muuten alihinnoittelet järjestelmällisesti jokaisen tapahtuman murto-osalla senttiä.

Tietotyyppien muunnos

Kriittistä, kun arvoja haetaan laskentataulukosta, koska soluarvot tulevat usein Variant-tyyppisinä:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl muuntaa Double-tyyppiin, CInt Integer-tyyppiin, CStr muuntaa String-tyyppiin ja CDate muuntaa oikeaksi Date-arvoksi.

Miksi ei vain antaa VBA:n muuntaa automaattisesti tarvittaessa? Useimmiten se toimiikin, mutta siihen luottaminen on riskialtista: solu, joka näyttää numerolta mutta onkin kirjoitettu tai tuotu tekstinä, voi aiheuttaa If-vertailun tai laskutoimituksen epäonnistumisen tai odottamattoman tuloksen, ja eksplisiittinen muunnos paljastaa virheen heti sillä rivillä, jossa huono data on, eikä vasta myöhemmin koodin edetessä.

Tehtävä

  1. Kirjoita rivi, joka poimii pelkän numeerisen osan "P003":stä käyttäen Mid-funktiota (vihje: aloita kohdasta 2).
  2. Kirjoita rivi, joka muuntaa poimitun tekstin oikeaksi numeroksi käyttäen CInt tai CLng.
  3. Käytä DateDiff-funktiota laskeaksesi, kuinka monta päivää sitten Emma Davis palkattiin (15/03/2020) verrattuna tähän päivään.
Vihje
expand arrow

1. Numeerisen osan poimiminen

  • Mid tarvitsee kolme tietoa: itse merkkijonon, mistä kohdasta aloitetaan laskeminen ja kuinka monta merkkiä otetaan.
  • "P003" sisältää yhden kirjaimen ja kolme numeroa — haluat ohittaa "P":n ja ottaa kaiken sen jälkeen.
  • Aloituskohta 2 tarkoittaa "aloita toisesta merkistä" — laske "P003" sormillasi varmistaaksesi, että kohta 2 on ensimmäinen "0".

2. Muuntaminen oikeaksi numeroksi

  • Kaikki, mitä Mid palauttaa, on edelleen tekstiä, vaikka se näyttää numerolta.
  • Kääri koko Mid(...)-lauseke CInt(...) tai CLng(...) sisään — muunnat yhden funktion tuloksen toisella funktiolla.
  • Muistutus aiemmin luvusta: CInt/CLng muuntaa tekstin kokonaisluvuksi; käytä CLng, jos et ole varma, voiko luku olla suuri.

3. Päivien määrä palkkauspäivästä

  • DateDiff tarvitsee kolme asiaa: mittayksikön ("d" päiville), aloituspäivän ja lopetuspäivän.
  • Hankala osa on päivämäärän kirjoittaminen VBA:ssa — ympäröi se #-merkeillä, kuten #03/15/2020#. #...#-sisällä VBA odottaa kuukausi/päivä/vuosi -järjestystä, alueasetuksista riippumatta — joten 15. maaliskuuta on #03/15/2020#, ei #15/03/2020#.
  • "Tätä päivää" varten sinun ei tarvitse kirjoittaa päivämäärää lainkaan — on olemassa avainsana kohdasta 2.3, joka palauttaa aina nykyisen päivämäärän.
  • Laita nämä kaksi päivämäärää DateDiff-funktioon oikeassa järjestyksessä — aikaisempi ensin — muuten saat negatiivisen luvun.
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 3
some-alt