Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Brug af indbyggede funktioner | VBA-Grundlæggende
Excel VBA til Forretningsautomatisering

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.

Note
Bemærk

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

  1. Skriv en linje, der udtrækker kun det numeriske fra "P003" ved hjælp af Mid (tip: start ved position 2).
  2. Skriv en linje, der konverterer den udtrukne tekst til et reelt tal med CInt eller CLng.
  3. Brug DateDiff til at beregne, hvor mange dage siden Emma Davis blev ansat (15/03/2020) i forhold til i dag.
Tip
expand arrow

1. Udtrækning af det numeriske

  • Mid kræ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 Mid returnerer, er det stadig tekst, selvom det ligner et tal.
  • Indsæt hele Mid(...)-udtrykket i CInt(...) eller CLng(...) — du konverterer resultatet af én funktion med en anden.
  • Påmindelse fra tidligere i kapitlet: CInt/CLng konverterer tekst til et heltal; brug CLng, hvis du ikke er sikker på, om tallet kan blive stort.

3. Dage siden ansættelsesdatoen

  • DateDiff kræ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 DateDiff i den rigtige rækkefølge — den tidligste dato først — ellers får du et negativt tal.
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 2. Kapitel 3
some-alt