Hop til teksten

IT FJERNUNDERVISNING
- IT kurser når Du har tid!

Kampagnepris på Excel VBA resten af året!

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

Dim strNavn As String

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

 

Når du har betalt for kurset får du adgang til øvelser til hver lektion. Og når du har fået godkendt din besvarelse får du desuden adgang til mine løsningsforslag med ekstra tips og trix.