Brug af indbyggede funktioner
Stryg for at vise menuen
VBA leveres med flere hundrede indbyggede funktioner, hvoraf de fleste sjældent bruges. Følgende funktioner anvendes ofte i forretningsautomatisering — til oprydning af tekst, arbejde med datoer og konvertering af datatyper.
Dato-funktioner
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() og Date ligner hinanden, men besvarer forskellige spørgsmål — Now() inkluderer det aktuelle klokkeslæt ned til sekundet (nyttigt til tidsstempling af, hvornår en makro blev kørt), mens Date kun giver kalenderdagen, hvilket er det, du ønsker til alt, der involverer forfaldsdatoer eller alder. DateAdd og DateDiff er hinandens modsætninger: DateAdd projicerer frem eller tilbage fra en dato med en given enhed ("d" for dage, men "m" for måneder og "yyyy" for år fungerer også), mens DateDiff måler afstanden mellem to eksisterende datoer.
VBA-datolitteraler — alt skrevet mellem #-symboler, som #01/09/2023# — bruger altid MM/DD/YYYY-rækkefølge internt, uanset dine Windows-regionindstillinger eller systemets lokalitet. Så #01/09/2023# betyder 9. januar 2023, ikke 1. september, selv for brugere, der til daglig anvender DD/MM/YYYY-format. Dette adskiller sig fra, hvordan datoer indtastes i et regneark, hvor regionale indstillinger gælder — #...#-literalformatet er en VBA-specifik regel, der forbliver fast uanset, hvor koden køres.
Tekstfunktioner
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 og LCase bruges til at gøre sammenligninger store/små-bogstavs-uafhængige, for eksempel: If UCase(category) = UCase("electronics") Then fungerer uanset, hvordan kategorien oprindeligt blev skrevet. Left, Right og Mid udtrækker en del af en streng og adskiller sig kun ved, hvor de starter: Left og Right tæller fra hver sin ende, mens Mid tager en startposition og en længde, hvilket er grunden til, at Mid("P001", 2, 3) og Right("P001", 3) tilfældigvis returnerer det samme her — "P001" har kun ét ciffer-præfiks, så "starter fra position 2" og "de sidste 3 tegn" rammer samme delstreng. Trim fjerner diskret foranstillede og efterstillede mellemrum — en ydmyg funktion, der ofte redder dig, når data er blevet kopieret ind med uens mellemrum. InStr søger efter én streng i en anden og returnerer positionen, hvor den findes (eller 0, hvis den ikke findes), hvilket er måden at teste "indeholder dette produktnavn ordet Mouse?" uden at kræve et eksakt match.
Numeriske funktioner
Debug.Print Round(24.996, 2) ' 25
Debug.Print Abs(-15) ' 15
Debug.Print Int(7.9) ' 7
Round og Int reducerer begge et tal, men på forskellig vis — Round(24.996, 2) runder til nærmeste værdi med 2 decimaler (25,00, som vises som 25), mens Int(7.9) altid afkorter ned mod nul uanset, hvor tæt decimalen er på at runde op, og giver 7 i stedet for 8. Forveksling af disse er en almindelig kilde til prisfejl: afrunding af en pris til nærmeste øre bør næsten altid bruge Round og ikke Int, ellers vil du systematisk underfakturere med en brøkdel af et øre ved hver transaktion.
Typekonvertering
Afgørende, når værdier hentes fra et regneark, da celleværdier ofte ankommer som Variant:
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 konverterer til Double, CInt til Integer, CStr konverterer til String, og CDate konverterer til en korrekt Date-værdi.
Hvorfor ikke bare lade VBA konvertere automatisk, når det er nødvendigt? Det vil det som regel, men det er usikkert: en celle, der ser ud som et tal, men faktisk er indtastet eller importeret som tekst, kan få en If-sammenligning eller en aritmetisk operation til at fejle eller opføre sig uventet, og eksplicit konvertering fanger det tidligt, med en fejl på præcis den linje, hvor de forkerte data findes, i stedet for flere trin senere.
Opgave
- Skriv en linje, der udtrækker kun det numeriske fra "P003" ved hjælp af
Mid(tip: start ved position 2). - Skriv en linje, der konverterer den udtrukne tekst til et reelt tal med
CIntellerCLng. - Brug
DateDifftil at beregne, hvor mange dage siden Emma Davis blev ansat (15/03/2020) i forhold til i dag.
1. Udtrækning af det numeriske
Midkræver tre elementer: selve strengen, hvor du starter optællingen, og hvor mange tegn du vil tage.- "P003" har ét bogstav efterfulgt af tre cifre — du skal springe "P" over og tage alt derefter.
- Startposition 2 betyder "begynd ved det 2. tegn" — tæl "P003" på dine fingre for at bekræfte, at position 2 er det første "0".
2. Konvertering til et reelt tal
- Uanset hvad
Midreturnerer, er det stadig tekst, selvom det ligner et tal. - Indsæt hele
Mid(...)-udtrykket iCInt(...)ellerCLng(...)— du konverterer resultatet af én funktion med en anden. - Påmindelse fra tidligere i kapitlet:
CInt/CLngkonverterer tekst til et heltal; brugCLng, hvis du ikke er sikker på, om tallet kan blive stort.
3. Dage siden ansættelsesdatoen
DateDiffkræver tre ting: hvilken enhed der skal måles i ("d" for dage), en startdato og en slutdato.- Det svære er at skrive en dato direkte i VBA — omslut den med
#-symboler, som#03/15/2020#. Inden for#...#forventer VBA altid måned/dag/år-rækkefølge, uanset dine regionale indstillinger — så 15. marts er#03/15/2020#, ikke#15/03/2020#. - For "i dag" behøver du ikke skrive en dato — der er et nøgleord fra afsnit 2.3, som altid returnerer den aktuelle dato.
- Sæt de to datoer ind i
DateDiffi den rigtige rækkefølge — den tidligste dato først — ellers får du et negativt tal.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat