VBA
Visual Basic for Applications (VBA) er navnet på det makrosprog
som findes i Microsoft Office programmerne (Word, Excel, Access etc).
Som navnet antyder minder sproget om Visual Basic. Det er blot tilpasset så det er
egnet som makrosprog.
Sproget er meget simpelt. Hvis man ønsker at definere en makro er det ofte lettest,
at slå makrooptageren til, udføre de ønskede handlinger en gang, stoppe makrooptageren og
så se hvordan koden kom til at se ud. Selv om man ikke lige ved hvordan man skriver koden
til bestemte handlinger så er det ret let at læse og forstå koden når makrooptageren har skrevet
den.
VBA eksempel: timetal (Excel)
Dette eksempel viser hvorledes man skriver en brugerdefineret funktion til Excel,
som kan beregne antal timer mellem 2 tidspunkter,
som begge er angivet i samme celle med en / (skråstreg) imellem.
Hvis man i celle A1 i Excel skriver 08:00/14:30 for at angive fra klokken 08:00
til klokken 14:30 så kan man ikke umiddelbart beregne hvor mange timer det svarer til.
For at beregne dette med Excels standardfunktioner skal start- og sluttidspunkt indtastes i
hver sin celle og indeholde både dato og tidspunkt.
Vi vil derfor fremstille en brugerdefineret funktion kaldet timetal som virker således
at man blot kan skrive =timetal(A1) i en celle for at få beregnet antallet af timer
mellem tidspunktet før og efter skråstregen. En sådan funktion kan være nyttig hvis man
eksempelvis laver vagtplaner i Excel og allerede har skrevet 2 tidspunkter i samme celle,
men alligevel ønsker at beregne timetallet.
Det eksempel jeg har fremstillet virker således:
- der skal indgå en skråstreg (ellers er der ikke 2 tider og så bliver resultatet 0)
- timer og minutter skal adskilles med : (minutter er valgfri - dvs fra klokken 14-17:30 kan skrives som 14/17:30 eller som 14:00/17:30)
- hvis tidspunktet efter skråstregen er tidligere end tidspunktet før skråstregen antages at man starter den ene dag og slutter den næste (eksempelvis vil 22:00/02:00 give 4 timer)
Koden til eksemplet ser således ud:
Function Timetal(tider As String) As Double
Dim tid1 As String
Dim tid2 As String
Dim tid1a As String
Dim tid1b As String
Dim tid2a As String
Dim Tid2b As String
Dim tal1 As Double
Dim tal2 As Double
Dim tal1a As Double
Dim tal1b As Double
Dim tal2a As Double
Dim tal2b As Double
Dim tid As Double
If InStr(tider, "/") = 0 Then
Timetal = 0
Else
tid1 = Left(tider, InStr(tider, "/") - 1)
tid2 = Mid(tider, InStr(tider, "/") + 1)
If InStr(tid1, ":") > 0 Then
tid1a = Left(tid1, InStr(tid1, ":") - 1)
tid1b = Mid(tid1, InStr(tid1, ":") + 1)
Else
tid1a = tid1
tid1b = ""
End If
tal1a = Val(tid1a)
tal1b = Val(tid1b)
tal1 = tal1a + (tal1b / 60)
If InStr(tid2, ":") > 0 Then
tid2a = Left(tid2, InStr(tid2, ":") - 1)
Tid2b = Mid(tid2, InStr(tid2, ":") + 1)
Else
tid2a = tid2
Tid2b = ""
End If
tal2a = Val(tid2a)
tal2b = Val(Tid2b)
tal2 = tal2a + (tal2b / 60)
tid = tal2 - tal1
If tid < 0 Then tid = tid + 24
Timetal = tid
End If
End Function
For at afprøve det selv, skal du sikre dig, at sikkerhedsniveauet i din Excel ikke
forhindrer, at du kører makroer. Du kontrollerer det, ved at vælge Funktioner,
Indstillinger, Sikkerhed i menuen. Vælg Makrosikkerhed. Hvis din Excel er indstillet til
Høj så lav det om til Mellem (VIGTIGT: Hvis du i fremtiden får Excel filer fra andre personer og
din PC spørger om den skal åbne med eller uden makroer bør du svare uden makroer hvis du
ikke har fuld tillid til afsender).
Du kan prøve eksemplet således:
- Kopier ovenstående kode til udklipsholder
- Start Excel
- Opret en ny tom projektmappe (XLS-fil)
- Gå til celle A1 og skriv 14/17:30 og tryk Enter
- Tryk Alt+F11 (starter VBA editor)
- Vælg Insert, Module i menuen
- Indsæt koden fra udklipsholderen
- Returner til Excel (Alt+Q)
- Gå til celle A3 og skriv =timetal(a1) og tryk Enter
- Prøv at rette tidspunkterne i celle A1 (alt efter hvorledes din Excel er indstillet skal du måske trykke F9 for at genberegne)
Hvis du ønsker at beregne summen at timer for 2 celler skriver du eksempelvis =timetal(a1)+timetal(b1)
Du kan også kigge i eksempelfilen vba_example_excel_timetal.xls.