Variabler
Vi har tidligere stødt på variabler et par gange. Man kan tænke på en variabel, som en slags kasse man kan gemme ting (tal, tekster mm.) i til senere brug. Det er god stil at fortælle systemet at man gerne vil bruge en variabel og hvilken datatype man gerne vil gemme i variablen. Det ser sådan her ud (kaldes en variabel erklæring):
Dim Variabelnavn As Datatype
Som tidligere nævnt kan man selv bestemme, hvad man vil kalde sine variable. Følgende datatyper kan anvendes i VBA:
Datatype |
Størrelse |
Område |
Byte |
1 byte |
0-255 |
Boolean |
2 bytes |
True eller False |
Integer |
2 bytes |
-32.768 til 32.767 |
Long |
4 bytes |
-2.147.438.648 til 2.147.438.647 |
Single |
4 bytes |
-3,4028E38 til -1,401E-45 eller 1,401E-45 til 3,4028E38 |
Double |
8 bytes |
-1,797E308 til -4,940E-324 eller 4,940E-324 til 1,797E308 |
Decimal |
14 bytes |
+/- 79.228.162.514.264.337.593.950.335 uden decimaler eller +/- 7,9228162514264337593543950335 |
Date |
8 bytes |
1. januar 100 til 31. december 9999 |
Objekt |
4 bytes |
Reference til objekt |
String (variabel længde) |
10 bytes + længden af strengen |
0 til ca. 2 milliard |
String (fast længde) |
Længen af strengen |
1 til ca. 65.400 |
Variant (med tal) |
16 bytes |
En hvilken som helst talværdi op til størrelsen af en double |
Variant (med tekst) |
22 bytes + strengens længde |
Samme område, som en streng med variabel længde |
Det er muligt at få VBA editoren til at kræve at alle variable erklæres. Det gør man ved at gå ind i Tools | Options og sætte hak i "Require Variable Declaration"
Der er ingen øvelser til denne lektion.
Lidt om datoer
Et lille eksempel
Dim dtJul As Date
Dim dtIDag As Date
Dim iDageTilJul As Integer
dtIDag = Date ' Giver datoen for i dag
dtJul = DateSerial(Year(dtIDag), 12, 24) ' Juleaften i år
iDageTilJul = Int(dtJul - dtIDag)
If iDageTilJul <= 0 Then
dtJul = DateSerial(Year(dtToday) + 1, 12, 24)
iDageTilJul = Int(dtJul - dtIDag)
End If
MsgBox "Der er " & iDageTilJul & " dage til næste juleaften"
Kan du se hvordan det virker?
Læg mærke til, hvilke dato funktioner du har tilgængelig:
Og slå op i hjælpefunktionen og se, hvad den enkelte funktion kan hælpe dig med, hvis du ikke lige kan gennemskue den.
Arrays
VBA tilbyder en Array datatype, som du kan bruge, hvis du har en masse informationer af samme type der hænger sammen f.eks. 20 integeres, 100 tekststrenge etc.
Med
fortæller du, at du har noget tekst information du gerne vil gemme til senere og at du gerne vil kunne hente det frem igen under navnet strNavn.
Nogen gange har vi ikke bare ét navn vi gerne vil gemme, men f.eks. 10. Er det tilfældet kan vi skrive
Dim strNavne(9) As String ' Man starter med 0
Og på den måde fortælle systemet, at vi har 10 tekststrenge vi gerne vil gemme og hente igen senere (i makroen).
Og skal man gemme noget i det array skriver man blot
strNavne(0) = "Thor Østergaard"
strNavne(1) = "Anders And"
osv.
Og så en tand mere avanceret...
Hvis man nu ønsker at gemme adresser sammen med nav ne kan man skrive
Dim atrNavneOgAdresser(9,2) As String
Og fylde infhold på ved at skrive
strNavneOgAdresser(0,0) = "Thor Østergaard"
strNavneOgAdresser(0,1) = "HvorJegBor 12"
strNavneOgAdresser(0,2) = "1234 MinBy"
strNavneOgAdresser(1,0) = "Anders And"
strNavneOgAdresser(1,1) = "Andeby"
Osv.
Jeg må indrømme, at det er forholdsvis sjældendt, at jeg bruger arrays - Excel er i sig selv jo et kæmpe array, hvor man kan hente og gemme data (det er blandt andet det du skal lære på kurset her ;-))
Lidt eksempler
Dim astNavne(20) As String ' Giver et array af 21 tekststrenge (vi starter med 0)
Dim iLoop As Integer
Dim astAdresser(20, 5) As String ' Giver 6 adresselinjer til hvert navn
For iLoop = 0 to 20
astNavne(iLoop) = InputBox("Navn " & iLoop & " tak :-)")
astAdresser(iLoop, 0) = InputBox("Adresse 1 " & iLoop & " tak :-)")
astAdresser(iLoop, 1) = InputBox("Adresse 2 " & iLoop & " tak :-)")
astAdresser(iLoop, 2) = InputBox("Postnummer " & iLoop & " tak :-)")
astAdresser(iLoop, 3) = InputBox("By " & iLoop & " tak :-)")
astAdresser(iLoop, 4) = "Danmark"
Next
Giver det mening??
Med LBound og Ubound kan du afgøre top og bund på et aktuelt array.
Ved du ikke, hvor mange elementer du skal have i dit array kan du med funktionen ReDim ændre antallet af elementer i et array:
Dim aiTal() As Integer ' Et antal tal
ReDim aiTal(5) ' Giver plads til 6 tal
Dim i As Integer
For i = 0 To 5
aiTal(i) = i*5
Next
ReDim Preserve aiTal(10) ' Giver plads til yderligere 5 tal uden at slette de første 6
Dim stBesked As String
For i = 0 to 10
stBesked = stBesked & aiTal(i) & ", "
Next
MsgBox stBesked