VBA-kod - OnePro IT

Transcription

VBA-kod - OnePro IT
EXCEL-VBA
ONEPRO IT
Objekt
ActiveX-kontroller
ActiveX-kontroller är en grupp verktyg som precis som formulärkontrollerna ska automatisera
och förenkla inmatning och kommunikation med kalkylblad och arbetsböcker. Den stora
skillnaden mellan formulär- och ActiveX-kontroller är att formulär knyts till specifika funktioner
via statiska cellreferenser medan ActiveX-kontrollerna kan knytas till olika funktioner med
hjälp av händelser och metoder i VBA-kod. Dessa blir alltså fristående objekt i Excel. Bägge
typerna av kontrollera hittas på menyfliken Utvecklare och knappen Infoga. Klicka på den
kontroll som ska användas och klicka sedan i kalkylbladet där kontrollen ska placeras.
Kalkylbladet går automatiskt över i designläge så att justeringar av storlek och position kan
ske. Innan kontrollen blir funktionell så måste designläget stängas av.
Egenskaper
Alla objekt i Excel (Active-X kontroller m.m.) har egenskaper som kan sättas via
egenskapsrutan eller via VBA-kod. Direkt när en ActiveX-kontroll skapas bör man klicka
egenskaper i menyfliken Utvecklare för att sätta grundläggande egenskaper beroende på
vilken typ av kontroll det är. Genomgående är det viktigt att namnge kontrollerna på ett bra
sätt så att man sedan i koden enkelt kan anropa respektive kontroll. Om kontrollen även
innehåller en text sätts den med egenskapen Caption.
Händelser – Metoder
För att programmet ska veta när det ska utföra den kod vi skriver så knyter vi vår kod till en
specifik händelse. Vilka händelser vi har att välja på beror på vilket objekt det är. En
händelse är sedan något som utförs av användaren t.ex. genom att klicka på, markera,
ändra eller kanske avmarkera ett objekt.
Exempel: Om vi vill att en kod ska köras när någon avmarkerar en textruta som heter
txtNamn så skapar vi en metod till just den händelsen
Private Sub txtNamn_LostFocus()
Vår kod…
End Sub
Om man högerklickar på det objekt som man vill knyta händelsen till och väljer Visa kod så
skapar VBA-fönstret en Metod med en föreslagen händelse (se mer info om VBA-fönstret
nedan)
VBA-fönstret
Tillgängliga objekt
Händelse att knyta till objekten
I VBA-fönstret skrivs den kod som skall köras i arbetsboken. Varje kalkylblad har sin
”kodsida” som man tar fram genom att dubbelklicka på respektive blad i navigationsfönstret
på vänstra sidan. Den kod som skrivs på respektive kalkylblad är endast tillgänglig där.
Förutom de olika kalkylbladen finns också en övergripande sida – ThisWorkbook, där kod
kan skrivas för hela arbetsboken och en moduldel där makron och globala funktioner (kod
som ska vara tillgänglig för hela arbetsboken) skapas.
Variabler
Variabler är tillfälliga objekt som kan skapas i koden. Variablerna syns aldrig fysiskt i
kalkylbladen men dom kan innehålla värden och därmed sedan användas på olika platser i
kalkylbladet/arbetsboken. En variabel skapas genom nyckelordet Dim följt av variabelns
namn och vilken typ av data man vill kunna knyta till variabeln.
Dim Age (Varibelns namn) As Integer (Datatyp)
Namnet på variabeln är helt valfritt, det bestämmer kodskrivaren. Datatypen måste dock
väljas från tillgängliga datatyper. Följande lista på datatyper är hämtad från VBA-hjälpen.
Byte
1 byte
0 to 255
Boolean
2 bytes
True or False
Integer
2 bytes
-32,768 to 32,767
Long
(long integer)
4 bytes
-2,147,483,648 to 2,147,483,647
Single
(single-precision
floating-point)
4 bytes
-3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38
for positive values
Double
(double-precision
floating-point)
8 bytes
-1.79769313486231E308 to
-4.94065645841247E-324 for negative values; 4.94065645841247E-324 to
1.79769313486232E308 for positive values
Currency
(scaled integer)
8 bytes
-922,337,203,685,477.5808 to 922,337,203,685,477.5807
Decimal
14 bytes
+/-79,228,162,514,264,337,593,543,950,335 with no decimal point;
+/-7.9228162514264337593543950335 with 28 places to the right of the decimal;
smallest non-zero number is
+/-0.0000000000000000000000000001
Date
8 bytes
January 1, 100 to December 31, 9999
Object
4 bytes
Any Object reference
String
(variable-length)
10 bytes + string
length
0 to approximately 2 billion
String
(fixed-length)
Length of string
1 to approximately 65,400
Variant
(with numbers)
16 bytes
Any numeric value up to the range of a Double
Variant
(with characters)
22 bytes + string
length
Same range as for variable-length String
User-defined
(using Type)
Number required by
elements
The range of each element is the same as the range of its data type.
Flera Variabler av samma datatyp kan skapas på en rad
Dim Age, Years, Atid, Days As Integer
Användarkommunikation
MsgBox
En Messagebox (meddelanderuta) används för att lämna information till användaren om t.ex.
ett visst villkor uppfylls. Kombineras ofta med If-villkor (se nedan). Meddelandetexten skrivs
som en textsträng inom en parantes.
Exempel: Låt oss säga att koden skall utföra en beräkning men användaren har glömt att
fylla i ett värde i cell A1 så att beräkningen inte kan göras korrekt. I stället för att
då få ett felaktigt värde kan vi informera användaren om att värdet saknas.
If Range(”A1”).Value = ”” Then
MsgBox(“Det saknas värde I cell A1!”)
…
InputBox
En InputBox (inmatningsruta) används för att hämta ett tillfälligt värde från användaren.
Oftast är värdet knutet till en variabel som sedan kan användas i en beräkning.
Meddelandetexten skrivs som en textsträng inom en parantes.
Exempel: Vi vill veta användarens födelsedatum för att kunna räkna ut åldern och skapar
en variabel kallad Birthdate.Vi hämtar variabelns värde med en InputBox
Dim Birthdate As Date
Birthdate = InputBox(”Ange födelsedatum”)
Vanliga villkorsrutiner
If, Else, ElseIf
If-satsen används för att kontrollera om ett villkor uppfylls. Om så är fallet kan man be
programkoden köra en programsats. Med utökningarna ElseIf och Else kan man utöka
satsen för att få med fler villkorskontroller i samma sats.
(Nyckelord: If, Then, ElseIf, Else, End If)
Exempel: Låt oss säga att värdet i cellen A1 bestämmer värdet i cellen B1. Om värdet i A1
är större än 100 så ska B1 ha värdet 0,5. Annars ska värdet i B1 vara 0,25. If
satsen ser ut så här
If Range(”A1”).Value > 100 Then
Range(“B1”).Value = 0.5
Else
Range(“B1”).Value = 0.25
End If
Om vi utökar med ett villkor till… Om värdet i cellen A1 är större än 200 ska
värdet i B1 vara 0,75. Vi lägger då även till ett ElseIf-villkor.
If Range(”A1”).Value > 200 Then
Range(“B1”).Value = 0.75
ElseIf Range(”A1”).Value > 100 Then
Range(“B1”).Value = 0.5
Else
Range(“B1”).Value = 0.25
End If
Select Case
I en situation där vi vill ha många alternative beroende på ett värde så är oftast Select Case
det smidigaste alternativet. Satsen bygger på att man anropar en egenskap och sedan
bygger olika scenarion för denna egenskap.
Vi tar föregående exempel där värdet i cell B1 är beroende utav värdet i cell A1.
Men vi lägger till några ytterligare alternativ.
Select Case Range(”A1”).Value
Case Is > 200
Range(“B1”).Value = 0.75
Case Is > 150
Range(“B1”).Value = 0.65
Case Is > 120
Range(“B1”).Value = 0.57
Case Is > 100
Range(“B1”).Value = 0.5
Case Else
Range(“B1”).Value = 0.25
End Select
Do While, Do Until
För att få programmet att upprepa något ända tills ett visst villkor uppfylls så används en Do
While- eller Do Until-sats. While används för att upprepa något så länge ett villkor uppfylls
och Until används för att upprepa något tills ett villkor uppfylls. Bägge kan oftast användas
och får i så fall styra villkoret. Nyckelordet Loop avslutar för att upprepa händelsen.
Vi har ett antal siffror i A-kolumnen med början i A1. Vi vill räkna upp alla värden
med 1 men bara så länge det finns värden. Vi väljer att utöka värdet med 1 och
sedan hoppa en cell nedåt ända tills vi träffar på en tom cell.
Range(”A1”).Activate
Do Until ActiveCell.Value = ""
ActiveCell.Value = ActiveCell.Value + 1
ActiveCell.Offset(1, 0).Activate
Loop
For Next
Do-satser används när man inte vet hur många gånger en upprepning ska ske. Om man
däremot vet hur många gånger upprepningen ska ske används istället en For Next-sats.
I det här fallet vill vi göra exakt samma sak som ovan men nu vet vi att det är
området A1-A10 som skall uppdateras. Koden skall alltså upprepas 10 ggr.
MyCounter nedan är namnet på räknaren vilket jag själv sätter.
Range(”A1”).Activate
For MyCounter = 1 to 10
ActiveCell.Value = ActiveCell.Value + 1
ActiveCell.Offset(1, 0).Activate
Next MyCounter
Loop
Exempelkod från introduktionsövning - Räknare
Private Sub cmdBerakna_Click()
' Bengt Nordström
' 2012-06-13
' Deklarerar variabler (som heltal - integer)
Dim Varde1 As Integer
Dim Varde2 As Integer
Dim Svar As Integer
' Tilldelar variablerna värden från textrutorna
Varde1 = txtVarde1.Value
Varde2 = txtVarde2.Value
'Kollar om det är tomt i textrutorna och skickar upp en meddelanderuta
If txtVarde2.Value = "" Then
MsgBox ("Det saknas värde i ruta 2!")
ElseIf txtVarde1.Value = "" Then
MsgBox ("Det saknas värde i ruta 1!")
End If
'Kollar vilken Alt-knapp som är vald och väljer räknesätt
If altPlus.Value = True Then
txtResultat.Value = Varde1 + Varde2
ElseIf altSub.Value = True Then
txtResultat.Value = txtVarde1.Value - txtVarde2.Value
ElseIf altMul.Value = True Then
txtResultat.Value = txtVarde1.Value * txtVarde2.Value
ElseIf altDiv.Value = True Then
txtResultat.Value = txtVarde1.Value / txtVarde2.Value
End If
Svar = txtResultat.Value
MsgBox ("Reslutatet av beräkningen blir " & Svar) 'Använder en variabel i en meddelanderuta
Range("A1").Activate 'Markerar en specifik cell
'Letar reda på första tomma cell i raden och markerar den
Do Until ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Activate
Loop
ActiveCell.Value = Svar 'Tilldelar dn markerade cellen värdet från en variabel
'tömmer textrutorna
txtVarde1.Value = ""
txtVarde2.Value = ""
txtResultat.Value = ""
cmdBerakna.Caption = "Klart!" 'Ändrar knapptext
txtVarde1.Activate 'Sätter markören i en taxtruta
End Sub
Private Sub cmdInput_Click()
Dim Namn As String
Namn = InputBox("Vad heter du? (Förnamn-Efternamn)")
Range("B1").Value = Namn
End Sub
Private Sub cmdRensa_Click()
Range("A:A").Value = "" 'tömmer ett cellområde
End Sub
Private Sub cmdUndo_Click()
Range("A1").Activate
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Activate
Loop
ActiveCell.Offset(-1, 0).Value = ""
End Sub
Private Sub txtVarde1_Change()
cmdBerakna.Caption = "Beräkna"
End Sub
Kalkylbladsobjekt från introduktionsövning
1 Bengt Nordström
Klart!
Ångra
Rensa A-kolumnen
Ansvarig
© 2011 - OnePRO IT – Bengt Nordström