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.
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ä
- Kirjoita rivi, joka poimii pelkän numeerisen osan "P003":stä käyttäen
Mid-funktiota (vihje: aloita kohdasta 2). - Kirjoita rivi, joka muuntaa poimitun tekstin oikeaksi numeroksi käyttäen
CInttaiCLng. - Käytä
DateDiff-funktiota laskeaksesi, kuinka monta päivää sitten Emma Davis palkattiin (15/03/2020) verrattuna tähän päivään.
1. Numeerisen osan poimiminen
Midtarvitsee 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ä
Midpalauttaa, on edelleen tekstiä, vaikka se näyttää numerolta. - Kääri koko
Mid(...)-lausekeCInt(...)taiCLng(...)sisään — muunnat yhden funktion tuloksen toisella funktiolla. - Muistutus aiemmin luvusta:
CInt/CLngmuuntaa tekstin kokonaisluvuksi; käytäCLng, jos et ole varma, voiko luku olla suuri.
3. Päivien määrä palkkauspäivästä
DateDifftarvitsee 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.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
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.
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ä
- Kirjoita rivi, joka poimii pelkän numeerisen osan "P003":stä käyttäen
Mid-funktiota (vihje: aloita kohdasta 2). - Kirjoita rivi, joka muuntaa poimitun tekstin oikeaksi numeroksi käyttäen
CInttaiCLng. - Käytä
DateDiff-funktiota laskeaksesi, kuinka monta päivää sitten Emma Davis palkattiin (15/03/2020) verrattuna tähän päivään.
1. Numeerisen osan poimiminen
Midtarvitsee 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ä
Midpalauttaa, on edelleen tekstiä, vaikka se näyttää numerolta. - Kääri koko
Mid(...)-lausekeCInt(...)taiCLng(...)sisään — muunnat yhden funktion tuloksen toisella funktiolla. - Muistutus aiemmin luvusta:
CInt/CLngmuuntaa tekstin kokonaisluvuksi; käytäCLng, jos et ole varma, voiko luku olla suuri.
3. Päivien määrä palkkauspäivästä
DateDifftarvitsee 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.
Kiitos palautteestasi!