Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Bruk av innebygde funksjoner | VBA-grunnleggende
Excel VBA for Forretningsautomatisering

Bruk av innebygde funksjoner

Sveip for å vise menyen

VBA leveres med flere hundre innebygde funksjoner, og de fleste av dem vil du aldri bruke. De nedenfor brukes ofte i forretningsautomatisering — for å rydde opp i tekst, arbeide med datoer og konvertere datatyper.

Dato-funksjoner

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 ser like ut, men svarer på ulike spørsmål — Now() inkluderer gjeldende klokkeslett ned til sekundet (nyttig for tidsstempling når en makro kjøres), mens Date kun gir deg kalenderdagen, noe som er ønskelig for alt som gjelder forfallsdatoer eller alder. DateAdd og DateDiff er motsetninger: DateAdd forskyver en dato fremover eller bakover med en gitt enhet ("d" for dager, men "m" for måneder og "yyyy" for år fungerer også), mens DateDiff måler avstanden mellom to eksisterende datoer.

Note
Merk

VBA-datolitteraler — alt skrevet mellom #-symboler, som #01/09/2023# — bruker alltid MM/DD/YYYY-rekkefølge internt, uavhengig av Windows-regioninnstillinger eller systemlokale. Så #01/09/2023# betyr 9. januar 2023, ikke 1. september, selv for brukere som vanligvis bruker DD/MM/YYYY. Dette er annerledes enn hvordan datoer skrives inn i et regneark, hvor regionale innstillinger gjelder — #...#-litteralformatet er en VBA-spesifikk regel som alltid er fast uansett hvor koden kjøres.

Tekstfunksjoner

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 brukes for å gjøre sammenligninger uavhengig av store og små bokstaver, for eksempel vil If UCase(category) = UCase("electronics") Then fungere uansett hvordan kategorien opprinnelig ble skrevet. Left, Right og Mid trekker ut en del av en streng, og forskjellen ligger i hvor de starter å telle: Left og Right teller fra hver sin ende, mens Mid tar en startposisjon og en lengde, derfor gir Mid("P001", 2, 3) og Right("P001", 3) samme resultat her — "P001" har bare ett siffer-prefiks, så "starter fra posisjon 2" og "de siste 3 tegnene" gir samme delstreng. Trim fjerner stille ledende og etterfølgende mellomrom — en lite glamorøs funksjon som ofte redder deg når data er kopiert fra steder med ujevn formatering. InStr søker etter én streng i en annen og returnerer posisjonen der den finnes (eller 0 hvis den ikke finnes), noe som lar deg teste "inneholder dette produktnavnet ordet Mouse?" uten å kreve et eksakt treff.

Numeriske funksjoner

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

Round og Int reduserer begge et tall, men på ulike måter — Round(24.996, 2) runder av til nærmeste verdi med 2 desimaler (25,00, som vises som 25), mens Int(7.9) alltid kutter ned mot null uansett hvor nær desimalen er å runde opp, og gir 7 i stedet for 8. Å blande disse er en vanlig kilde til prisfeil: avrunding av pris til nærmeste øre bør nesten alltid bruke Round, ikke Int, ellers vil du systematisk underprise med en brøkdel av et øre på hver transaksjon.

Typekonvertering

Kritisk når du henter verdier fra et regneark, siden celleverdier ofte kommer 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 gyldig Date-verdi.

Hvorfor ikke bare la VBA konvertere automatisk ved behov? Det vil det som regel, men å stole på det er sårbart: en celle som ser ut som et tall, men faktisk er skrevet eller importert som tekst, kan føre til at en If-sammenligning eller en aritmetisk operasjon feiler eller oppfører seg uventet, og eksplisitt konvertering fanger dette tidlig, med en feil på akkurat den linjen hvor de dårlige dataene finnes, i stedet for flere steg senere.

Oppgave

  1. Skriv en linje som henter ut kun det numeriske fra "P003" ved å bruke Mid (tips: start på posisjon 2).
  2. Skriv en linje som konverterer den uttrukne teksten til et reelt tall med CInt eller CLng.
  3. Bruk DateDiff for å beregne hvor mange dager siden Emma Davis ble ansatt (15/03/2020) sammenlignet med i dag.
Tips
expand arrow

1. Hente ut det numeriske

  • Mid tar tre deler: selve strengen, hvor du skal starte å telle fra, og hvor mange tegn du skal hente.
  • "P003" har én bokstav etterfulgt av tre sifre — du skal hoppe over "P" og hente alt etter den.
  • Startposisjon 2 betyr "begynn på det andre tegnet" — tell ut "P003" på fingrene for å bekrefte at posisjon 2 er den første "0".

2. Konvertere til et reelt tall

  • Det du får tilbake fra Mid er fortsatt tekst, selv om det ser ut som et tall.
  • Pakk hele Mid(...)-uttrykket inn i CInt(...) eller CLng(...) — du konverterer resultatet fra én funksjon med en annen.
  • Påminnelse fra tidligere i kapitlet: CInt/CLng konverterer tekst til heltall; bruk CLng hvis du ikke er sikker på om tallet kan bli stort.

3. Dager siden ansettelsesdato

  • DateDiff trenger tre ting: hvilken enhet du skal måle i ("d" for dager), en startdato og en sluttdato.
  • Det vanskelige er å skrive en datoverdi i VBA — omslutt den med #, som #03/15/2020#. Inne i #...# forventer VBA alltid måned/dag/år-rekkefølge, uansett regionale innstillinger — så 15. mars er #03/15/2020#, ikke #15/03/2020#.
  • For "i dag" trenger du ikke skrive inn en dato — det finnes et nøkkelord fra seksjon 2.3 som alltid gir dagens dato.
  • Sett disse to datoene inn i DateDiff i riktig rekkefølge — den tidligste datoen først — ellers får du et negativt tall tilbake.
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 3

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 2. Kapittel 3
some-alt